【问题标题】:Why does ADO Next record processing slow down in Delphi?为什么在 Delphi 中 ADO Next 记录处理速度变慢?
【发布时间】:2009-09-30 05:46:07
【问题描述】:

我有一个多年前开发的 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 方法顺序处理记录。

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

【问题讨论】:

    标签: performance delphi ado


    【解决方案1】:

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

    否则速度很差。

    详情请参阅this article

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

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

    【讨论】:

    • 添加“ArticlesTable.DisableControls;”在“ArticlesTable.First;”之前解决了这个问题。完美的!非常感谢!
    【解决方案2】:

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

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

    问候。

    【讨论】:

    • 我在提出问题之前尝试解决问题时确实尝试过。但它没有任何明显的效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多