2009-09-30 21 views
5

私は何年も前に開発したDelphi 4プログラムを持っていました。これはOpus DirectAccessを使用して、Microsoft Accessデータベースを順次検索し、必要なレコードを取得しました。 Delphi 4にはADOがないため、DirectAccessを使用していました。なぜADOの次のレコード処理がDelphiで遅くなるのですか?

しかし、私は今Delphi 2009にアップグレードし、ADOを使用するようにプログラムを変換しました。私が見つけたのは、DirectAccessのように(10万レコードの)テーブルのループが始まりましたが、テーブルを通過するにつれて速度が遅くなり、速度が遅くなり、遅くなります。基本ループは次のとおりです。

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

データセットでDB対応コントロールを使用していない場合は、すべてのADOデータセットでDisableControlsを呼び出す必要があります。

それ以外の場合、速度は悪いです。

詳細はthis articleを参照してください。

また、

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

「ArticlesTable.DisableControls;」を追加する「ArticlesTable.First;」の前に問題を修正しました。完璧!どうもありがとうございます! – lkessler

1

内部ADOレコードセットプロパティを使用また、あなたはあなたのアクセスコンポーネント(TADOTable/TADOQuery/...)のカーソル。プロパティを変更することができます。

を試してください。ctOpenForwardOnlyを実行するとパフォーマンスが低下します。 DBGridを切断して(接続している場合)、ループを終了するときに再接続する必要がある可能性があります。

よろしくお願いいたします。

+0

私は質問をする前に問題を解決しようとしていたときにそれを試しました。しかし、それには目立った効果はなかった。 – lkessler

関連する問題