Что такое хороший способ доступа к файлам dBase с использованием BDE и Delphi?
Прежде всего, я должен заявить, что я полный новичок, когда дело доходит до Delphi, хотя я занимался программированием в Turbo Pascal в школе, около четырнадцати лет назад...
У меня есть коммерческая программа Delphi, которая использует базу данных dBase и BDE для доступа к ним. Мне нужно подключить к этой базе данных другое приложение, написанное на C#, чтобы иметь возможность выполнять такие операции SQL, как выбор, вставка, обновление и удаление.
К сожалению, использование OLEDB против dBase приводит к некорректным индексам, и только нативные приложения BDE могут безопасно получать доступ к данным.
Основная идея состояла в том, чтобы создать простое консольное приложение Delphi, которое могло бы читать операторы SQL из стандартного ввода (Read/ReadLn) и выводить данные CSV в стандартный вывод (WriteLn).
Как бы я поступил так?
Я успешно получил простой TTable-доступ к работе со следующим кодом:
tbl := TTable.Create(nil);
tbl.DatabaseName := 'Exceline';
tbl.TableName := 'KUNDE.DBF';
tbl.Active := True;
WriteLn(tbl.RecordCount);
tbl.Active := False;
Есть ли способ, которым я мог бы добиться того же, но путем выполнения прямых операторов SQL вместо этого?
3 ответа
Вы можете сделать то же самое, используя компонент TQuery:
qry := TQuery.Create(nil);
qry.DatabaseName := 'Exceline';
qry.SQL.Add('SELECT COUNT(*) AS CNT FROM KUNDE');
qry.Active := True;
WriteLn(qry.FieldByName('CNT').AsString);
qry.Active := False;
Как уже писал Серг: Вы можете использовать объект tquery для выполнения SQL-запросов к таблицам dbase. Но будьте осторожны: способ, которым вы предлагаете сделать это - передача запроса sql программе через stdin и возвращение результатов на stdout - очень медленный в Windows.
Кроме того, вам придется добавить дополнительные команды в вашу программу для возврата данных в пакетном режиме, если результат запроса огромен. Вероятно, это будет проще и даст вам гораздо лучшую производительность для написания COM-сервера в Delphi с использованием C#.
И последнее замечание: BDE не поддерживается Borland/Codegear/Embarcadero в течение нескольких лет. Это все еще работает, но все сложнее и сложнее его сохранить, особенно с более новыми версиями Windows, чем XP. Одной из альтернатив может быть tdbf (см. Sourceforge), но у меня недостаточно опыта, чтобы дать вам обоснованное мнение по этому поводу.
Поскольку BDE не поддерживается, поскольку он устарел 10 лет назад:
Рассматривали ли вы сервер базы данных Advantage? Это сервер, который может получить доступ к dBase, Clipper и другим xBase
Он работает очень хорошо, и для него доступен поставщик данных.NET.
Это сделает ваш путь решения намного менее сложным.
--jeroen