3

我通常将 TADOQuery 与持久字段(每个表 1 个)一起使用,但现在我发现自己陷入了一个难题:我必须同时运行多个查询(只读)。

我发现了很多关于线程的文档。然而,这意味着为每个操作新创建一个 TADOQuery,所以现在我正在寻找使用它们的最佳方式。

就像我说的,我通常使用持久性字段,但在这种情况下,我不确定它们是否是最好的,因为必须为每个生命周期很短的 TADOQuery 实例创建它们。

在我看来,我有 4 个选项:

1 - Create a MyTADOQuery class with it's own persistent fields for each table
2 - Add manually the persistent fields to each new TADOQuery
3 - ADOQuery.FieldByName('field').Value approach
4 - ADOQuery.Field[i].Value approach

选项 1 似乎矫枉过正(实际上没有尝试过),选项 3 很慢。

我的常识告诉我选项 4 是要走的路,但我必须问:

以上哪个(或其他 - 请告诉)是使用新创建的 TADOQuery 实例的最快和最便宜的方式?

谢谢

4

1 回答 1

3

@MartynATADODataSet通过使用返回多个记录集的 SP(并非所有数据提供者都支持多个记录集。这不能通过 MS-Access 完成。因为它不支持返回多个记录集)给出了一个非常好的主意) - 您没有指定使用哪个数据库。

使用 SQL Server,您不必使用 SP,并返回多个记录集,如下所示:

qry.SQL.Text := 'SELECT * FROM Table1; SELECT * FROM Table2';    

您需要直接使用 ADO qry.RecordsSet( _RecordSet)。要移动到下一个记录集,请使用qry.NextRecordset例如:

var
  RS: _RecordSet;

qry.Open;
RS := qry.Recordset;
repeat
  while not RS.EOF do
  begin
    for I := 0 to RS.Fields.Count - 1 do
      FieldValue := RS.Fields[I].Value;
    // or access Fields by name: RS.Fields['Field'].Value
    RS.MoveNext;
  end;
  RS := qry.NextRecordset(RecordsAffected);
until VarIsEmpty(RS);    

这是恕我直言最快的方法。

无论如何,我个人总是尽量避免使用持久性字段。
我使用持久字段的唯一情况是当我需要将计算/查找字段添加到TDataSet.

在这种情况下,我将动态填充持久字段(运行时),然后动态添加额外的计算/查找字段。

如果您明智地使用ADOQuery.FieldByName('Field')它,它不会(相对)慢(不要在迭代循环内重复使用它 -TField在迭代 TDataSet 之前将其分配给一次)。

ADOQuery.Field[i].Value更快,但有时您必须通过其名称访问该字段。这一切都取决于场景。ADOQuery.FieldByName恕我直言,因为您确切知道您指的是哪个文件,所以更易阅读且更易于维护。

于 2013-11-13T11:44:05.397 回答