3

私は通常、永続フィールド (テーブルごとに 1 つ) で TADOQuery を使用しますが、今は難問に直面しています。同時に複数のクエリを実行する必要があります (読み取り専用)。

スレッド化に関する多くのドキュメントを見つけました。ただし、これは操作ごとに新しく作成された 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

@MartynA は、複数のレコードセットTADODataSetを返す SP を使用して、単一の複数のレコードセットを使用する非常に良いアイデアを提供しました (すべてのデータ プロバイダーが複数のレコードセットをサポートしているわけではありません。たとえば、MS-Access ではこれを実行できませんでした。複数のレコードセットを返すことをサポートしていないためです)。 ) - 使用する DB を指定していません。

SQL Server では、SP を使用する必要はなく、次のように複数のレコードセットを返します。

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

qry.RecordsSetADO ( _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')、(比較的) 遅くはなりません (反復ループ内で繰り返し使用しないでください - TFieldTDataSet を反復する前に一度に割り当てます)。

ADOQuery.Field[i].Valueの方が高速ですが、名前でフィールドにアクセスする必要がある場合があります。それはすべてシナリオに依存します。ADOQuery.FieldByNameどのファイルを参照しているかを正確に知っているため、私見はより読みやすく、維持しやすくなっています。

于 2013-11-13T11:44:05.397 に答える