取得と格納に関する質問(FireDAC)
レコードの取得とデータセットへの格納に関係する質問と回答の一覧です。
Q1: FireDAC では、結果データセットへの高速順方向専用の読み取り専用アクセスは可能ですか。
A: ADQuery.FetchOptions を以下のように設定します。
- CursorKind = ckDefault または ckForwardOnly
- Mode = fmOnDemand
- RowsetSize = 1000
- Unidirectional = True
- データセットを編集する必要がない場合は、Items プロパティから fiMeta を除外することもできます。
Q2: 複数の結果セットを ADQuery または ADMemTable の末尾に追加するには、どうすればよいでしょうか。
A: 複数の結果セットを保持するクライアント データセットの以下のような処理は、
begin loop
// run SqlQuery with new params
...
ClientDataset.AppendData(SqlQuery.Data)
...
end loop
単一の TFDQuery に置き換えることができます。以下に例を示します。
// initial open and fetch
ADQuery1.Params[0].AsInteger := 1;
ADQuery1.Open;
// reexecute command, fetch rows again and append them
// to the existing rows
ADQuery1.Command.Close;
ADQuery1.Params[0].AsInteger := 2;
ADQuery1.Command.Open;
ADQuery1.FetchAgain;
ADQuery1.FetchAll;
// reexecute again with different parameter value
ADQuery1.Command.Close;
ADQuery1.Params[0].AsInteger := 3;
ADQuery1.Command.Open;
ADQuery1.FetchAgain;
ADQuery1.FetchAll;
Q3: クエリを実行し、その結果セットを既存のデータセットの末尾に追加する(ただし、これらのレコードをデータベースに挿入せずに行う)には、どうすればよいでしょうか。
A: TFDDataSet.FetchAgain メソッドの説明を参照してください。あるいは、以下のように、追加のレコードを取得して既存のデータセットに格納する SQL コマンドを実行することもできます。
ADCommand1.CommandText := 'select ... from ... where id= :id';
ADCommand1.Open;
ADCommand1.Fetch(ADQuery1.Table);
ADCommand1.Close;
Q4: クエリの結果、800 件のレコードが返されますが、RecordCount は 50 になります。どこが間違っているのでしょうか。
A: デフォルトでは、RecordCount はデータセット レコードのキャッシュに入っているレコードの数を示します。レコード カウント モードの詳細については、TFDFetchOptions.RecordCountMode プロパティを参照してください。
50 はデフォルトの行セット サイズです。これは、単一の要求で FireDAC により取得されるレコードの数です。そのため、開いた直後、データセット内のレコードは 50 件以下になっており、それを RecordCount が示しているのです。データセット内を移動すると、行セットがさらに取得され、レコードの数がしだいに増えるでしょう。
クエリの結果返されるレコードの総数を表示するには、以下のいずれかの方法を使用できます。
- ADQuery1.FetchAll を実行する。その結果、すべてのレコードが取得され、RecordCount がその数を示します。
- FetchOptions.RecordCountMode を cmTotal に設定する。なお、その場合は、SELECT クエリのたびに追加の SELECT COUNT(*) クエリが FireDAC により実行されるので、パフォーマンスが低下するおそれがあります。