【问题标题】:The most efficient way (fastest and cheapest) of working with a new TADOQuery使用新 TADOQuery 的最有效方式(最快和最便宜)
【发布时间】:2013-11-13 21:43:02
【问题描述】:

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

谢谢

【问题讨论】:

  • 5.尝试在同一批次中提交多个查询(例如,使用参数化存储过程)并使用 NextRecordSet 方法获取第 2..N 个结果集。
  • @MartynA - 到目前为止我还没有使用过 TADOStoredProc,但我会看看。似乎很有希望。 TLama - 很好,谢谢!
  • 顺便说一句,对不起,我假设您使用 Sql Server 作为后端。如果你是,你可能会发现从 TAdoQuery 开始最容易,它很高兴从 Sql Server 一次获得多个结果集。一旦它的工作票嘘声,把它们放在一个 SP 中,也许是为了整洁。

标签: delphi ado


【解决方案1】:

@MartynA 通过使用返回多个记录集的 SP(并非所有数据提供者都支持多个记录集。例如,MS-Access 无法做到这一点。因为它使用多个记录集和单个 TADODataSet不支持返回多个记录集) - 您没有指定使用哪个数据库。

使用 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'),它不会(相对)慢(不要在迭代循环中重复使用它 - 在迭代 TDataSet 之前将其分配给 TField 一次)。

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

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    相关资源
    最近更新 更多