gpt4 book ai didi

delphi - 使用新 TADOQuery 的最有效方式(最快且最便宜)

转载 作者:行者123 更新时间:2023-12-03 15:54:45 26 4
gpt4 key购买 nike

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

谢谢

最佳答案

@MartynA 提出了一个非常好的主意,通过使用返回多个记录集的 SP,将多个记录集与单个 TADODataSet 结合使用(并非所有数据提供程序都支持多个记录集。这无法通过 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 恕我直言,更具可读性且更易于维护,因为您确切地知道所引用的文件。

关于delphi - 使用新 TADOQuery 的最有效方式(最快且最便宜),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19951765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com