Delphi 打开数据库表

Delphi 打开数据库表,delphi,dbase,Delphi,Dbase,我必须使用ADOConnection和AdoTable从旧的数据库中复制一些信息。我可以打开所有表,但我得到了这个例外 数据提供者或其他服务 返回了E_失败状态 当试图打开一个1.01GB(1093588624字节)的大表时。我注意到性能非常差。这是连接字符串 ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[path]) 我认为

我必须使用ADOConnection和AdoTable从旧的数据库中复制一些信息。我可以打开所有表,但我得到了这个例外

数据提供者或其他服务 返回了E_失败状态

当试图打开一个1.01GB(1093588624字节)的大表时。我注意到性能非常差。这是连接字符串

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

我认为使用TADOConnection的
CursorLocation
的默认设置是
ClusClient
。通过该设置,客户端将整个数据集读入内存。这可以解释速度慢,也可以解释错误

尝试将其更改为
clUseServer

ADOConn.CursorLocation := clUseServer;

或者,您可以在对象检查器属性中更改它。

如果您的TAdoConnection仍然存在问题,我建议您这样做。这支持多种不同的表类型(Clipper NTX、Foxpro CDX)。

这听起来像是在标题中有一个autoopen(.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;

清除标头中的该标志后,您应该能够使用ADO或-打开.DBF-他们的本地服务器是免费的,并且支持SQL。请注意,我与Advantage没有任何关联;很长一段时间以来,我一直在使用他们的产品处理遗留DBF文件。

@Najem:它可能在寻找一个能够进行更新的主键。我在这里只是猜测,但可能在表上尝试不同的游标类型(可能是ctKeyset或ctStatic)。将游标类型更改为clUseServer后,性能有所提高。整个5746353录像机Loader我知道它已被弃用,但您是否尝试过使用BDE打开它?