Delphi ADO查询

时间:2010-02-22 16:42:25

标签: delphi dataset ado

有没有比

更快的方式来遍历ADO数据集
while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;

我需要扫描大约9000个项目的数据集,并且只提取与预定义的分支编号集匹配的记录。

6 个答案:

答案 0 :(得分:10)

如果没有必要花时间更新DataSet上关联的可见控件,请确保使用“禁用控件”/“启用控件”。

try
  ADOQuery1.DisableControls;
  while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;
finally
  ADOQuery1.EnableControls;
end;

问候。

答案 1 :(得分:8)

@Pieter,两个选项

1)你可以在执行之前修改你的sql语句,添加与预定义的分支数集匹配的where条件。

2)使用TAdoQuery的Filter属性。

AdoQuery1.close;
AdoQuery1.filter := 'your condition goes here';
AdoQuery1.filtered := true;
AdoQuery1.Open;

答案 2 :(得分:7)

将ADORecordset用于此类任务要快得多:

 while not ADOQuery1.Recordset.EOF do
  begin
    ADOQuery1.Recordset.MoveNext;
    // get value
    SomeVar := ADOQuery1.Recordset.Fields['FieldName'].Value;  
  end;

答案 3 :(得分:0)

可以通过避免任何字符串比较直到尽可能晚(当其他所有内容匹配时)来获得额外的性能提升。如果数据库中有大量重复的字符串,请考虑将字符串放在单独的表中,并通过整数链接回第一个表。

答案 4 :(得分:0)

您可能希望更改查询以包含SQL where子句,例如

Select whatever fields From whatevertable
where branchnumber in (
    select branchnumber from whatevertable where branchid=xxz
)

我还强烈建议只使用前向只读游标来提高速度。

答案 5 :(得分:0)

Delphi ADO东西(TADOQueryTADOTable)也不错,很糟糕(用Delphi XE2 / 2007检查)。是通过sql文件和Navicat将数据从Transbase表(ODBC驱动程序)导出到MySQL。对于具有接近百万条记录的表,通过ADO需要花费数小时(800万条记录表在2天后完成10%),使用TQuery几分钟(但由于大表的BDE错误可能会崩溃,BDE是没有更新过去15年),几分钟通过纯ODBC或Navicat。 我的建议:使用任何东西代替ADO(至少在开发人员认真重写之前)。