我有一个数据库* .mdb。任务是从此数据库的某个字段获取所有值并将其写入文件。 现在代码看起来像这样
while not ADOQuery1.Eof do begin
resultstringlist.add(ADOQuery1.FieldByName('_fieldname_').asString);
ADOQuery1.next;
end;
它有效,但我认为有更优化和更快的选择。数据库大小约为40,000条记录,此过程需要相当长的时间。我需要使用的数据库包含数十倍的记录和数十个表。 我认为这是一个非常愚蠢的问题,但我自己几天都找不到解决方案。我的数据库是一个未开发的领域。不久,我希望。
答案 0 :(得分:5)
不要在紧密循环中使用FieldByName
,它会在每次调用时对数据集的Fields
进行线性搜索。相反,在循环之前查找字段并将结果分配给TField局部变量,并使用该变量访问循环中的字段值。所以,使用像
var AField : TField;
...
AField := ADOQuery1.FieldByName('_fieldname_');
ADOQuery1.DisableControls;
try
while not ADOQuery1.Eof do begin
resultstringlist.add(AField.asString);
ADOQuery1.next;
end;
finally
ADOQuery1.EnableControls;
end;
对DisableControls
和EnableControls
的调用通过更新连接到AdoQuery的任何db-aware gui控件来避免循环速度变慢。
您可能还习惯在任何TStrings下降的对象上调用BeginUpdate
和EndUpdate
,同时在紧密循环中更新它们。