TFDMemTable に関する質問
FAQ(FireDAC) への移動
このトピックでは、TFDMemTable に関係する質問と回答の一覧を扱います。
Q: TClientDataSet では、レコードの追加、削除、変更を行った後、TClientDataSet.Delta を処理することができます。これは TFDMemTable でも可能ですか。
A: TFDMemTable にも似た機能がありますが、こちらは "キャッシュ更新" モデルに従っています。CachedUpdates プロパティの値が True の場合、MemTable は変更を更新ログに記録します。
更新をデータベースにポストするには、ApplyUpdates を使用する必要があります。変更ログをマージするには、CommitUpdates を呼び出す必要があります。
これらおよびその他のメソッドについては、FireDAC のヘルプ ファイルや FireDAC\Samples\Comp Layer\TFDMemTable フォルダ内のサンプルを参照してください。
Q: クライアント データセットで CloneCursor を多用しています。TFDQuery の場合は、どうすればよいでしょうか。
A: 以下のコードを使用します。
FDMemTable1.CloneCursor(FDQuery1, False, False);
Q: FDMemTable を作成しデータを設定するには、どうすればよいでしょうか。
A: 1) インメモリ データセットを作成します。
with FDMemTable1.FieldDefs do begin
with AddFieldDef do begin
Name := 'f1';
DataType := ftInteger;
end;
with AddFieldDef do begin
Name := 'f2';
DataType := ftString;
Size := 50;
end;
end;
with FDMemTable1 do begin
Open;
Append;
Fields[0].AsInteger := ...;
Fields[1].AsString := ...;
Post;
end;
2) それにデータを追加し、閲覧/編集を行います。
Q: 別のデータセットから(構造も含めて)TFDMemTable を読み込むには、どうするのが最も手っ取り早いでしょうか。
A: TDataSet から TFDMemTable に構造とデータをコピーするには、以下のように CopyDataSet メソッドを使用するのが最も簡単です。
FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]);
Q: FDQuery から FDMemTable にすべてのレコードをコピーし FDMemTable でそれらを編集するには、どうすればよいでしょうか。
A: 以下のようにするとよいでしょう。
// UniDirectiona must be false if no
FDQuery1.FetchOptions.Undirectional := False;
FDQuery1.Open;
FDQuery1.FetchAll;
FDMemTable1.Data := FDQuery1.Data;
FDMemTable1.First;
while not FDMemTable1.Eof do begin
FDMemTable1.Edit;
.......
FDMemTable1.Post;
FDMemTable1.Next;
end;
Q: ftGUID 型の永続フィールドを追加できません。フィールドのサイズに関するエラーが出力されるのですが、フィールド サイズの制御は無効になっています。どこが間違っているのでしょうか。
A: これは DB.pas ユニットの既知の問題です(http://qc.embarcadero.com/wc/qcmain.aspx?d=8008 を参照)。この問題を回避するには、実行時に GUID フィールドを作成します。
Q: どのような場合にメモリ テーブルを使用すると有利かの一般的なルールはありますか。
A: FireDAC を使用しているだけであれば、メモリ内にしかないデータがある場合にのみ FDMemTable を使用してください。また、CSV ファイルを FDMemTable に読み込めるなどの特別な場合には、LocalSQL を使ってこの CSV データの問い合わせを行います。
それ以外のタスクには、TFDMemTable とほとんど同じクライアント側機能を持つ TFDQuery や TFDStoredProc を使用することができます。
Q: 一括編集(挿入、編集、削除)時の TFDMemTable のパフォーマンスを最適化するにはどうすればよいでしょうか。
A: LogChanges、FetchOptions、ResourceOptions、UpdateOptions の各プロパティを設定します。
FDMemTable1.LogChanges := False;
FDMemTable1.FetchOptions.RecsMax := 300000; //Sample value
FDMemTable1.ResourceOptions.SilentMode := True;
FDMemTable1.UpdateOptions.LockMode := lmNone;
FDMemTable1.UpdateOptions.LockPoint := lpDeferred;
FDMemTable1.UpdateOptions.FetchGeneratorsPoint := gpImmediate;
その後、一括編集の操作を BeginBatch/EndBatch のメソッド呼び出しで囲みます。
FDMemTable1.BeginBatch;
try
for i := 1 to 1000 do begin
FDMemTable1.Append;
// ...
FDMemTable1.Post;
end;
finally
FDMemTable1.EndBatch;
end;