2011-03-24 64 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