Questions relatives aux opérations d'extraction et de remplissage (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à FAQ (FireDAC)

Cette rubrique contient une liste des questions et réponses relatives à l'extraction d'enregistrements et au remplissage des ensembles de données.

Q1 : FireDAC fournit-il un accès en avance rapide uniquement et en lecture seule à l'ensemble de résultats ?

R : Définissez ADQuery.FetchOptions :

  • CursorKind = ckDefault ou ckForwardOnly
  • Mode = fmOnDemand
  • RowsetSize = 1000
  • Unidirectional = True
  • Si vous n'avez pas besoin de modifier l'ensemble de données, excluez fiMeta d'Items.

Q2 : Comment puis-je ajouter plusieurs ensembles de résultats à un composant ADQuery ou ADMemTable ?

R : L'approche suivante avec l'ensemble de données client permet de contenir plusieurs ensembles de résultats :

 begin loop
     // run SqlQuery with new params
     ...
     ClientDataset.AppendData(SqlQuery.Data)
     ...
   end loop

peut être remplacé par le TFDQuery unique. Par exemple :

 // 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 : Comment puis-je exécuter une requête et ajouter son ensemble de résultats à un ensemble de données existant, sans insérer ces enregistrements dans la base de données ?

R : Voir la description de la méthode TFDDataSet.FetchAgain. Vous pouvez aussi exécuter une commande SQL qui extraira les enregistrements supplémentaires dans un ensemble de données existant :

 ADCommand1.CommandText := 'select ... from ... where id= :id';
 ADCommand1.Open;
 ADCommand1.Fetch(ADQuery1.Table);
 ADCommand1.Close;

Q4 : Ma requête renvoie 800 enregistrements alors que RecordCount en renvoie 50. Quel est le problème ?

R : Par défaut, RecordCount indique le nombre total d'enregistrements dans le cache d'enregistrements de l'ensemble de données. Pour de plus amples informations sur les modes de comptage des enregistrements, voir la propriété TFDFetchOptions.RecordCountMode.

La taille par défaut de l'ensemble de lignes est 50. Il s'agit du nombre d'enregistrements que FireDAC extrait pour une seule requête. Par conséquent, juste après l'ouverture, l'ensemble de données aura <= 50 enregistrements, c'est-à-dire ce que RecordCount affiche. Quand vous naviguez dans l'ensemble de données, il extrait des ensembles de lignes supplémentaires et le nombre d'enregistrements peut augmenter.

Vous pouvez utiliser l'une des méthodes suivantes pour afficher le nombre total d'enregistrements que la requête renvoie :

  • Effectuez ADQuery1.FetchAll. Tous les enregistrements sont alors extraits et RecordCount affiche leur nombre ;
  • Définissez FetchOptions.RecordCountMode sur cmTotal. Notez que cette action peut entraîner une dégradation des performances, car FireDAC effectue une requête SELECT COUNT(*) supplémentaire pour chaque requête SELECT.