1

我有一个数据库 *.mdb。任务是从该数据库的某个字段中获取所有值并将它们写入文件。现在代码看起来像这样

while not ADOQuery1.Eof do begin
   resultstringlist.add(ADOQuery1.FieldByName('_fieldname_').asString);
   ADOQuery1.next;
end;

它有效,但我认为有一个更优化和更快的选择。由于数据库大小约为 40,000 条记录,此过程需要相当长的时间。我需要使用的数据库包含数十倍的记录和数十个表。我认为这是一个非常愚蠢的问题,但我自己在几天内找不到解决方案。对我来说,数据库是一个未开发的领域。不会太久,我希望。

4

1 回答 1

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;

通过更新连接到 AdoQuery 的任何 db-aware gui 控件,调用DisableControlsEnableControls避免循环变慢。

您可能还会养成在紧密循环中更新它们的同时调用任何 TStrings-descended 对象BeginUpdate的习惯。EndUpdate

于 2018-04-06T19:04:30.273 回答