Extraction des lignes (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des commandes (FireDAC)

Gestion des curseurs

Lorsqu'une commande SQL est exécutée et qu'elle doit renvoyer des lignes, le SGBD crée un curseur sur le serveur du SGBD. Une application utilise le curseur pour extraire des lignes d'une base de données. Il existe plusieurs types de curseurs, selon le SGBD utilisé. Pour choisir le type de curseur, utilisez la propriété FetchOptions.CursorKind. Par défaut, FireDAC choisit le type de curseur le plus rapide (ckAutomatic). Tout d'abord, cette propriété est significative pour Microsoft SQL Server.

Les curseurs de SGBD sont sensibles au contexte transactionnel ayant servi à leur ouverture. Pour plus d'informations, consultez la rubrique "Gestion des transactions".

Extraction des ensembles de lignes

La fonctionnalité d'extraction des ensembles de lignes permet de définir le nombre d'enregistrements qui seront extraits du serveur en une seule boucle réseau. Vous pouvez optimiser ce processus pour chaque instruction SELECT que vous exécutez, en réduisant ainsi le nombre de boucles réseau par le biais de la définition de l'option RowsetSize.

La taille des ensembles de lignes est gérée par la propriété FetchOptions.RowsetSize. Plus la taille est grande, plus la vitesse d'extraction de l'ensemble de résultats complet est rapide mais plus le délai d'extraction de l'ensemble de lignes suivant est important. De plus, à partir de certaines valeurs "élevées", les performances commencent à décroître. Les valeurs admises les plus élevées sont comprises entre 2 000 et 3 000.

Remarque : Tous les SGBD ne prennent pas en charge la fonction d'extraction des ensembles de lignes. FireDAC permet toutefois d'émuler cette fonction, mais au détriment de la vitesse. L'extraction émulée des ensembles de lignes présente une diminution de la vitesse de 50 % par rapport à l'extraction réelle.

FireDAC extrait les ensembles de lignes en fonction de la propriété FetchOptions.Mode :

  • fmOnDemand -- l'ensemble de lignes est extrait automatiquement lorsque l'ensemble de données tente de déplacer la position actuelle au-delà du dernier enregistrement extrait.
  • fmAll -- tous les ensembles de lignes sont extraits automatiquement, juste après l'exécution de la commande SQL. Cette propriété est similaire à l'appel de la méthode FetchAll.
  • fmManual -- le développeur extrait manuellement les ensembles de lignes à l'aide de la méthode FetchNext ou FetchAll.
  • fmExactRecsMax -- tous les ensembles de lignes sont extraits automatiquement, juste après l'exécution de la commande SQL. Si le nombre de lignes est différent de FetchOptions.RecsMax, une exception est déclenchée.

Lorsque la propriété FetchOptions.Unidirectional est définie sur True, et avant l'extraction de l'ensemble de lignes suivant, l'ensemble de lignes précédent est ignoré dans la mémoire. Cela permet de préserver la mémoire du PC lors de l'extraction des ensembles de résultats volumineux.

Lorsque tous les enregistrements sont extraits, TFDDataSet.SourceEOF prend la valeur True et la commande sous-jacente est fermée, en fonction de la propriété FetchOptions.AutoClose. Cette action ne ferme pas l'ensemble de données lui-même.

Remarque : Pour plus d'informations, consultez la rubrique Groupes de commandes.

L'application accède à chaque enregistrement extrait à l'aide du gestionnaire d'événement TFDDataSet.AfterGetRecord.

Pagination de lignes

FetchOptions.RecsSkip et RecsMax permettent la pagination de l'ensemble de résultats. Une fois le curseur ouvert, le premier enregistrement RecsSkip est ignoré. Les autres enregistrements, jusqu'à RecxMax, sont extraits. La modification des valeurs des propriétés RecsSkip et RecsMax est sans effet lorsqu'une instruction est préparée. Par conséquent, avant que la page de lignes suivante soit extraite, vous devez annuler la préparation de la commande, puis la réexécuter. Par exemple :

FDQuery1.FetchOptions.RecsSkip := 0;
FDQuery1.FetchOptions.RecsMax := 100;
FDQuery1.Open;
// process rows

FDQuery1.Disconnect;
FDQuery1.FetchOptions.RecsSkip := 100;
FDQuery1.Open;
// process rows

FDQuery1.Disconnect;
FDQuery1.FetchOptions.RecsSkip := 200;
FDQuery1.Open;
// process rows

Dans la mesure du possible, lorsque les propriétés RecsSkip et/ou RecsMax sont spécifiées, FireDAC modifie la commande SELECT initiale pour appliquer les phases TOP / ROWS et similaires.


Extraction différée

L'ensemble de résultats peut inclure des colonnes d'objets BLOB (binary large objects) et/ou d'ensembles de données imbriqués. En général, ces colonnes ralentissent l'extraction des ensembles de résultats. FireDAC permet d'en différer l'extraction jusqu'à ce que leurs valeurs soient vraiment nécessaires. La propriété FetchOptions.Items contrôle les aspects suivants :

  • Lorsque fiBlobs est exclu, FireDAC diffère l'extraction des valeurs BLOB. La méthode FetchBlobs effectue l'extraction des valeurs BLOB pour l'enregistrement d'ensemble de données en cours. Sinon, la première lecture d'une valeur BLOB appelle automatiquement FetchBlobs, lorsque Mode <> fmManual.
  • Lorsque fiDetails est exclu, FireDAC diffère l'extraction des ensembles de données imbriqués. La méthode FetchDetails effectue l'extraction des ensembles de données imbriqués pour l'enregistrement en cours. De plus, fiDetails contrôle la gestion maître-détail.

Pour plus d'informations sur la génération de commandes SQL d'extraction différée, consultez la rubrique Génération de commandes de mise à jour.

Remarque : L'exclusion de fiBlobs ou fiDetails de la propriété FetchOptions.Items ne modifie pas la liste SELECT d'une commande SQL. Si un SGBD transfère des valeurs BLOB par valeur (par exemple, Oracle LONG, MySQL, SQL Server, SQLite), les valeurs BLOB seront distribuées au client via le réseau. Toutefois, elles ne seront pas stockées dans le cache d'enregistrements du client. En revanche, si un SGBD transfère des valeurs BLOB par référence (par exemple, Oracle CLOB / BLOB, Interbase, Firebird), les valeurs BLOB ne seront ni distribuées ni stockées.

Nouvelle extraction de lignes

Une application doit parfois ajouter le nouvel ensemble de résultats à un ensemble existant ou procéder à une nouvelle extraction de lignes. La méthode FetchAgain sert ces objectifs.

Remarque : Utilisez la méthode Refresh pour l'actualisation de l'ensemble de données.

Exemples d'utilisation courants

Le tableau suivant présente les exemples d'utilisation courants ainsi que les configurations de FetchOptions correspondantes :

Exemple Description
Temps d'extraction minimal de volumes d'enregistrements importants avec une utilisation de la mémoire limitée. CursorKind = ckDefault ou ckForwardOnly

Mode = fmOnDemand RowsetSize = 1000 Unidirectional = True

Temps d'extraction minimal avec un délai à l'ouverture de la requête. CursorKind = ckDefault

Mode = fmAll RowsetSize = 1000

Délai minimal à l'ouverture de la requête. CursorKind = ckDynamic

Mode = fmOnDemand RowsetSize = 50 Exclusion de fiMeta de Items.

Ensemble de données en lecture seule. Exclusion de fiMeta de la propriété Items, ou définition de la propriété UpdateOptions.RequestLive sur False.
Groupe de commandes avec plusieurs ensembles de résultats. AutoClose = False
Temps d'extraction minimal de volumes d'enregistrements importants avec plusieurs valeurs BLOB élevées et une utilisation de la mémoire limitée. Exclusion de fiBlobs de la propriété Items. A associer avec les observations faites plus haut.

Voir aussi

Exemples