Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么在Delphi中ADO下一条记录处理速度会减慢?_Performance_Delphi_Ado - Fatal编程技术网

Performance 为什么在Delphi中ADO下一条记录处理速度会减慢?

Performance 为什么在Delphi中ADO下一条记录处理速度会减慢?,performance,delphi,ado,Performance,Delphi,Ado,我有一个Delphi 4程序,是我多年前开发的,用于顺序搜索Microsoft Access数据库并检索所需的记录。Delphi4没有ADO,所以我使用DirectAccess 但我现在已经升级到Delphi2009,并将程序转换为使用ADO。我发现,表中的循环(大约100000条记录)开始时的速度与DirectAccess中的一样快,但随后开始变慢,并且在表中循环时变得越来越慢。基本循环是: ArticlesTable.First; while not Cancel and not Artic

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

但我现在已经升级到Delphi2009,并将程序转换为使用ADO。我发现,表中的循环(大约100000条记录)开始时的速度与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方法按顺序处理记录


那么为什么它会变慢,我如何重新编码它,使它不会变慢呢?

如果在数据集上没有使用DB感知控件,那么应该在所有ADO数据集上调用DisableControls

否则速度会很差

有关详细信息,请参阅

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

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

此外,您还可以更改Access组件(TaToTable/TADOQuery/…)的CursorType属性

尝试ctOpenForwardOnly以提高性能;您可能需要断开de DBGrid(如果您连接了一个)并在退出循环时重新连接


关于。

在“ArticlesTable.First”之前添加“ArticlesTable.DisableControls;”修复了该问题。完美的非常感谢你!在我提出问题之前,当我试图解决问题时,我确实试过了。但它没有任何明显的效果。