有没有比
更快的方式来遍历ADO数据集while (not ADOQuery1.Eof) do
begin
/* Do something */
ADOQuery1.Next;
end;
我需要扫描大约9000个项目的数据集,并且只提取与预定义的分支编号集匹配的记录。
答案 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东西(TADOQuery
或TADOTable
)也不错,很糟糕(用Delphi XE2 / 2007检查)。是通过sql文件和Navicat将数据从Transbase表(ODBC驱动程序)导出到MySQL。对于具有接近百万条记录的表,通过ADO需要花费数小时(800万条记录表在2天后完成10%),使用TQuery
几分钟(但由于大表的BDE错误可能会崩溃,BDE是没有更新过去15年),几分钟通过纯ODBC
或Navicat。
我的建议:使用任何东西代替ADO(至少在开发人员认真重写之前)。