【问题标题】:Can I get all records from one speciefic field with single command?我可以使用单个命令从一个特定字段获取所有记录吗?
【发布时间】:2018-04-06 17:37:48
【问题描述】:

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

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

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

【问题讨论】:

  • 您的 SQL 查询是什么样的?您查询的字段是否有索引?
  • 为什么首先要检索 40K(或更多)记录?您无法在列表框或组合框中有效地向用户显示它。听起来您应该重新考虑您的应用程序逻辑和 SQL 语句。此外,您要花费大量时间为字符串列表重新分配内存,因为它必须不断增长,不断增长,这也会消耗大量时间(并且可能会非常严重地碎片化内存)。
  • 我可以创建一个包含一些我需要处理的字段的新数据库。它将有大约 20-50 个字段,但都是相同的 40,000 条记录。这不是客户端-服务器或客户端-客户端的通常交换。这是一个积累了几天实验数据的数据库,我需要使用它。构建图表、插值、评估不同字段之间的相关性等。每条记录中的第一个字段是沿 X 轴的一个点(日期时间格式)。其余字段是沿 Y 轴的点(实数或整数格式)。我不能只拿一百分,只和他们一起工作。

标签: delphi tadoquery


【解决方案1】:

不要在紧密循环中使用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;

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

您可能还会养成在任何 TStrings 后裔对象上调用 BeginUpdateEndUpdate 的习惯,同时在紧密循环中更新它们。

【讨论】:

  • 是的。也许迭代内部Recordset 可以带来更多乐趣:)
  • 感谢你们两位,我会尽快尝试,让您知道该解决方案将在多大程度上加快计算速度。
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2017-04-02
相关资源
最近更新 更多