открыть таблицу базы данных - PullRequest
2 голосов
/ 24 марта 2011

Мне нужно скопировать некоторую информацию из старой базы данных dBase, используя ADOConnection и AdoTable.Я могу открыть все таблицы, но получаю это исключение

Поставщик данных или другой сервис вернул статус E_FAIL

при попытке открыть большую таблицу 1,01 ГБ093 588 624 байта).Отмечу, что производительность очень плохая.это строка подключения

  ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[path])

Ответы [ 3 ]

4 голосов
/ 24 марта 2011

Звучит так, как будто в заголовке есть флаг индекса автоматического открытия (.MDX), но индекс не существует в базе данных.

Вы можете попробовать это - он очищает этот флаг автоматического открытия в заголовке базы данных. ИСПОЛЬЗУЙТЕ КОПИЮ БАЗЫ ДАННЫХ ДЛЯ ТЕСТИРОВАНИЯ !!! Я не тестировал DBase IV, но он работает на нескольких разновидностях FoxPro и DBase.

procedure FixDBFHeader(const FileName: string);
var
  ByteRead: Byte;
  Stream: TFileStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenReadWrite or fmShareDenyNone);
  try
    // Byte offset 28 has a value of 0x01 if a structural (auto-open) index exists,
    // or 0x00 if no such index exists. If the value is not set, we do nothing.
    Stream.Position := 28;
    Stream.Read(ByteRead, SizeOf(ByteRead));
    if ByteRead = 1 then
    begin
      ByteRead := 0;
      Stream.Position := 28;
      Stream.Write(ByteRead, SizeOf(Byte));
    end;
  finally
    Stream.Free;
  end;
end;

После снятия этого флага в заголовке вы сможете открыть .DBF с помощью ADO или Advantage Database Server - их локальный сервер свободен и поддерживает SQL. Обратите внимание, что я никак не связан с Advantage; Я только что использовал их продукт для работы с устаревшими файлами DBF в течение длительного времени.

4 голосов
/ 24 марта 2011

Я считаю, что значение по умолчанию для CursorLocation с TADOConnection составляет clUseClient.С этим параметром весь набор данных считывается в память клиентом.Это объясняет медлительность и может объяснить ошибку.

Попробуйте изменить ее на clUseServer.

ADOConn.CursorLocation := clUseServer;

Или вы можете изменить его в свойствах инспектора объектов.

0 голосов
/ 24 марта 2011

Если у вас все еще есть проблемы с TAdoConnection, я бы предложил Apollo .Это поддерживает много разных типов таблиц (Clipper NTX, Foxpro CDX).

...