为什么ADO Next记录处理在Delphi中变慢?

时间:2009-09-30 05:46:08

标签: performance delphi ado

我有一个多年前开发的Delphi 4程序,它使用Opus DirectAccess顺序搜索Microsoft Access数据库并检索所需的记录。 Delphi 4没有ADO,所以这就是我使用DirectAccess的原因。

但我现在升级到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方法顺序处理记录。

那么为什么它会变慢,我怎么能重新编码它以免它变慢?

2 个答案:

答案 0 :(得分:10)

如果您没有在数据集上使用数据库感知控件,则应在所有ADO数据集上调用DisableControls。

否则速度很快。

请参阅this article了解详情。

或者,使用内部ado记录集属性

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

答案 1 :(得分:1)

此外,您可以更改Access组件的 CursorType 属性(TADOTable / TADOQuery / ...)。

尝试 ctOpenForwardOnly 来提升效果;您可能需要断开de DBGrid(如果已连接一个)并在退出循环时重新连接。

问候。