TFDMemTable に関する質問

提供: RAD Studio
移動先: 案内検索

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 とほとんど同じクライアント側機能を持つ TFDQueryTFDStoredProc を使用することができます。

Q: 一括編集(挿入、編集、削除)時の TFDMemTable のパフォーマンスを最適化するにはどうすればよいでしょうか。

A: LogChangesFetchOptionsResourceOptionsUpdateOptions の各プロパティを設定します。

  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;