Questions relatives à TFDMemTable

De RAD Studio
Aller à : navigation, rechercher

Remonter à FAQ (FireDAC)

Cette rubrique liste des questions et réponses relatives à TFDMemTable.


Q : Avec un TClientDataSet, il est possible d'ajouter, supprimer, modifier des enregistrements, puis traiter TClientDataSet.Delta. Est-ce possible avec un TFDMemTable ?

R : Un TFDMemTable présente des fonctionnalités similaires, mais il suit le modèle Mises à jour en cache. Lorsque la valeur de la propriété CachedUpdates est True, MemTable enregistre les modifications des enregistrements dans le journal des mises à jour.

Pour valider des mises à jour dans une base de données, vous devez utiliser ApplyUpdates. Pour fusionner le journal des modifications, vous devez appeler CommitUpdates.

Vous pouvez trouver la description de ces méthodes et d'autres méthodes dans les fichiers d'aide de FireDAC et des exemples dans le dossier FireDAC\Samples\Comp Layer\TFDMemTable.

Q : J'utilise beaucoup CloneCursor avec des ensembles de données client. Comment puis-je faire la même chose avec TFDQuery ?

R : Utilisez le code suivant :

FDMemTable1.CloneCursor(FDQuery1, False, False);

Q : Comment puis-je créer et remplir un FDMemTable ?

R : 1) Créez l'ensemble de données en mémoire.

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) Ajoutez-y des données, explorez/modifiez-le.

Q : Quel est le moyen le plus rapide pour charger un TFDMemTable à partir d'un autre ensemble de données (y compris la structure) ?

R : Le moyen le plus simple de copier la structure et les données à partir d'un TDataSet vers un TFDMemTable est d'utiliser la méthode CopyDataSet :

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

Q : Comment puis-je copier tous les enregistrements de FDQuery dans FDMemTable et les modifier dans FDMemTable ?

R : Vous pouvez procéder comme ceci :

// 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 : Je ne peux pas ajouter un champ persistant de type ftGUID. J'obtiens une erreur concernant la taille du champ, mais le contrôle de la taille du champ est désactivé. Quel est le problème ?

R : Il s'agit d'un problème connu dans l'unité DB.pas : http://qc.embarcadero.com/wc/qcmain.aspx?d=8008 (EN). La solution consiste à créer un champ GUID à l'exécution.

Q : Existe-t-il une règle générale pour savoir quand il est intéressant d'utiliser une table mémoire ?

R : Si vous utilisez seulement FireDAC, FDMemTable ne devrait être utilisé que lorsque vous avez des données en mémoire uniquement. Dans certains cas particuliers, vous pouvez par exemple charger un fichier CSV dans un FDMemTable, puis utiliser LocalSQL pour interroger ces données CSV.

Pour d'autres tâches, vous pouvez simplement utiliser TFDQuery / TFDStoredProc, car ils ont pratiquement les mêmes capacités côté client que TFDMemTable.

Q : Comment puis-je optimiser les performances de TFDMemTable lors d'un grand nombre de modifications (insertion, modification, suppression) ?

R : Définissez les propriétés suivantes LogChanges, FetchOptions, ResourceOptions et 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;

Insérez ensuite les opérations de modification en grand nombre dans les appels de méthode BeginBatch / EndBatch :

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