使用新TADOQuery的最有效方式(最快和最便宜)

时间:2013-11-13 10:49:52

标签: delphi ado

我通常使用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实例的最快和最便宜的方式?

谢谢

1 个答案:

答案 0 :(得分:3)

@MartynA通过使用返回多个记录集的SP(并非所有数据提供者都支持多个记录集),使用具有单个TADODataSet的多个记录集给出了一个非常好的想法。例如,这不能通过MS-Access完成。因为它不支持返回多个记录集) - 您没有指定使用哪个DB。

使用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);    

这是IMHO最快的方法。

无论如何,我个人总是试图避免持久的字段 我使用持久字段的唯一情况是我需要向TDataSet添加计算/查找字段。

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

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

ADOQuery.Field[i].Value速度更快,但有时您必须通过名称访问该字段。这一切都取决于场景。 ADOQuery.FieldByName是恕我直言,更易读,更容易维护,因为你确切知道你提到的归档。