2009-09-30 91 views
5

我有一個多年前開發的Delphi 4程序,它使用Opus DirectAccess來順序搜索Microsoft Access數據庫並檢索所需的記錄。 Delphi 4沒有ADO,所以這就是我使用DirectAccess的原因。爲什麼在Delphi中ADO Next記錄處理速度變慢?

但我現在升級到Delphi 2009並將程序轉換爲使用ADO。我發現,通過表格(大約100,000條記錄)的循環開始的速度與DirectAccess中的循環速度一樣快,但隨後開始變慢,並且在通過表格時變得越來越慢。基本循環是:

ArticlesTable.First; 
while not Cancel and not ArticlesTable.Eof do begin 

    (See if the current record has criteria desired) 
    (If so, process the record) 

    ArticlesTable.Next; 
end; 

所以基本上,它只是使用.Next方法按順序處理記錄。

那麼爲什麼它放緩,我怎麼能重新編碼這個,以便它不會放慢速度?

回答

10

如果您未在數據集上使用數據庫感知控件,則應在所有ADO數據集上調用DisableControls。

否則速度很糟糕。

參考this article瞭解詳情。

另外,使用內部ADO記錄集屬性

while Not ADOQuery1.Recordset.EOF do 
begin 
    ADOQuery1.Recordset.Movenext; 
end; 
+0

添加「ArticlesTable.DisableControls;」在「ArticlesTable.First;」之前解決了這個問題。完善!非常感謝! – lkessler 2009-09-30 06:30:08

1

此外,你可以改變你的訪問組件的CursorType的財產(TADOTable/TADOQuery/...)。

嘗試ctOpenForwardOnly以提高性能;可能需要斷開與DBGrid的連接(如果已連接),並在退出循環時重新連接。

問候。

+0

我在嘗試修復問題之前曾試過,當時我問這個問題。但它沒有任何明顯的影響。 – lkessler 2009-09-30 18:41:44