2011-03-24 29 views
2

我不得不使用ADOConnection和AdoTable从旧的dBase数据库复制一些信息。我能打开所有表,但我得到这个例外打开一个dBase表

数据提供商或其他服务 试图打开一个大表1.01 GB返回E_FAIL状态

(1个093 588个624字节) 。我注意到,表现非常糟糕。这是在连接字符串

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

我知道这是过时的,但你有没有尝试开放使用BDE? – 2011-03-24 18:14:59

回答

4

相信随着TADOConnection默认设置为CursorLocationclUseClient。使用该设置,整个数据集将被客户端读入内存。这将解释缓慢并可能解释错误。

尝试将其更改为clUseServer

ADOConn.CursorLocation := clUseServer; 

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

+0

当我更改为clUseServer时,我得到'索引未找到'! – Najem 2011-03-24 14:47:01

+0

@Najem:它可能正在寻找能够进行更新的主键。我只是猜测在这里,但也许尝试在表上不同的游标类型(可能ctKeyset或ctStatic)。 – 2011-03-24 14:59:50

+0

将游标类型更改为clUseServer后性能有所提高。整个5746353录像机加载 – Najem 2011-03-24 15:43:23

-1

如果您仍然有TAdoConnection问题,我会建议Apollo。这支持许多不同的表类型(Clipper NTX,Foxpro CDX)。

+0

但不是DBase IV MDX。 – 2011-03-24 15:02:20

4

这听起来像是头部有一个autoopen(.MDX)索引标志,但索引不存在于数据库中。

你可以试试这个 - 清除数据库头中的autoopen标志。 使用数据库的副本进行测试!我还没有在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或Advantage Database Server打开.DBF - 他们的本地服务器是免费的,支持SQL。请注意,我不以任何方式隶属于Advantage;我刚刚使用他们的产品来处理传统的DBF文件很长一段时间。

+0

+1用于**使用数据库的副本进行测试!!! ** – Najem 2011-03-24 15:25:31