我通常使用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实例的最快和最便宜的方式?
谢谢
答案 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
是恕我直言,更易读,更容易维护,因为你确切知道你提到的归档。