Fragen zu TFDMemTable

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu FAQ (FireDAC)

Dieses Thema enthält eine Liste mit Fragen und Antworten zu TFDMemTable.


F: Mit TClientDataSet kann man Datensätze hinzufügen, löschen, ändern und dann TClientDataSet.Delta verarbeiten. Ist das mit TFDMemTable auch möglich?

A: TFDMemTable verfügt über ähnliche Funktionen, folgt aber dem Modell Zwischengespeicherte Aktualisierungen. Wenn die Eigenschaft CachedUpdates auf True gesetzt ist, trägt MemTable Änderungen in das Änderungsprotokoll ein.

Um Änderungen in eine Datenbank einzutragen, müssen Sie ApplyUpdates verwenden. Um das Änderungsprotokoll zusammenzuführen, müssen Sie CommitUpdates aufrufen.

Eine Beschreibung dieser und anderer Methoden finden Sie in den FireDAC-Hilfedateien und -Beispielen im Ordner "FireDAC\Samples\Comp Layer\TFDMemTable".

F: Ich verwende für Client-Datenmengen häufig CloneCursor. Wie kann ich CloneCursor mit TFDQuery verwenden?

A: Verwenden Sie den folgenden Code:

FDMemTable1.CloneCursor(FDQuery1, False, False);

F: Wie kann ich eine FDMemTable-Komponente erstellen und füllen?

A: 1) Erstellen Sie im Arbeitsspeicher eine Datenmenge.

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) Fügen Sie der Datenmenge Daten hinzu, durchsuchen oder bearbeiten Sie sie.

F: Wie lade ich am schnellsten eine TFDMemTable aus einer anderen Datenmenge (einschließlich der Struktur)?

A: Am schnellsten kopieren Sie die Struktur und die Daten aus einer TDataSet- in eine TFDMemTable-Komponente mit der Methode CopyDataSet:

FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]);

F: Wie kann ich alle Datensätze aus FDQuery in FDMemTable kopieren und sie in FDMemTable bearbeiten?

A: Sie können z. B. Code wie den folgenden verwenden:

// 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;

F: Ich kann kein persistentes Feld mit dem Typ ftGUID hinzufügen. Ich erhalte einen Fehler bezüglich der Feldgröße, aber das Steuerelement für die Feldgröße ist deaktiviert. Was ist falsch?

A: Dies ist ein bekanntes Problem in der Unit DB.pas: http://qc.embarcadero.com/wc/qcmain.aspx?d=8008. Erstellen Sie zur Lösung des Problems zur Laufzeit ein GUID-Feld.

F: Gibt es eine allgemeine Regel dazu, wann eine Arbeitsspeichertabelle verwendet werden sollte?

A: Wenn Sie ausschließlich FireDAC verwenden, dann sollten Sie FDMemTable nur einsetzen, wenn Daten lediglich im Arbeitsspeicher vorliegen. Und auch für einige Sonderfälle; beispielsweise können Sie eine CSV-Datei in FDMemTable laden und dann mit LocalSQL diese CSV-Daten abfragen.

Für andere Aufgaben können Sie einfach TFDQuery/TFDStoredProc verwenden, da diese Komponenten nahezu dieselben clientseitigen Möglichkeiten wie TFDMemTable bieten.

F: Wie kann ich die Leistung von TFDMemTable bei Massenbearbeitungen (Einfügen, Bearbeiten, Löschen) optimieren?

A: Legen Sie die folgenden Eigenschaften fest: LogChanges, FetchOptions, ResourceOptions und 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;

Fügen Sie dann Massenbearbeitungen in BeginBatch/EndBatch-Methodenaufrufe ein:

  FDMemTable1.BeginBatch;
  try
    for i := 1 to 1000 do begin
      FDMemTable1.Append;
      // ...
      FDMemTable1.Post;
    end;
  finally
    FDMemTable1.EndBatch;
  end;