Partager via


Extraction de lignes

L’interface IRowset est l’interface d’ensemble de lignes de base. L’interface IRowset fournit des méthodes pour extraire des lignes de manière séquentielle, obtenir les données de ces lignes et gérer les lignes. Les consommateurs utilisent les méthodes dans IRowset pour toutes les opérations d’ensemble de lignes de base. Cela inclut l’extraction et la libération de lignes et l’obtention de valeurs de colonne.

Lorsqu’un consommateur obtient un pointeur d’interface sur un ensemble de lignes, la première étape consiste généralement à déterminer les fonctionnalités de l’ensemble de lignes à l’aide de la méthode IRowsetInfo ::GetProperties . Cela retourne des informations sur les interfaces exposées par l’ensemble de lignes et également les fonctionnalités de l’ensemble de lignes qui ne s’affichent pas en tant qu’interfaces distinctes, telles que le nombre maximal de lignes actives et le nombre de lignes pouvant avoir des mises à jour en attente en même temps.

L’étape suivante pour les consommateurs consiste à déterminer les caractéristiques, ou métadonnées, des colonnes de l’ensemble de lignes. Pour cela, ils utilisent la méthode IColumnsInfo pour des informations de colonne simples ou la méthode IColumnsRowset pour les informations de colonne étendues. La méthode GetColumnInfo retourne les informations suivantes :

  • Nombre de colonnes dans le jeu de résultats.

  • Tableau de structures DBCOLUMNINFO, une par colonne.

    L’ordre des structures est l’ordre dans lequel les colonnes apparaissent dans l’ensemble de lignes. Chaque structure DBCOLUMNINFO inclut des métadonnées de colonne, telles que le nom de colonne, l’ordinal de la colonne, la longueur maximale possible d’une valeur dans la colonne, le type de données de la colonne, la précision et la longueur.

  • Pointeur vers un stockage pour toutes les valeurs de chaîne dans un bloc d’allocation unique.

Le consommateur détermine les colonnes dont il a besoin à partir des métadonnées ou en fonction de la commande de texte qui a généré l’ensemble de lignes. Il détermine les ordinales des colonnes nécessaires à partir de l’ordre des informations de colonne retournées par IColumnsInfo ou à partir des ordinals de l’ensemble de lignes de métadonnées de colonne retourné par IColumnsRowset.

Les interfaces IColumnsInfo et IColumnsRowset sont utilisées pour extraire des informations sur les colonnes de l’ensemble de lignes. L’interface IColumnsInfo retourne un ensemble limité d’informations, tandis que IColumnsRowset fournit toutes les métadonnées.

Remarque

Dans SQL Server version 7.0 et versions antérieures, la colonne de métadonnées facultative DBCOLUMN_COMPUTEMODE retournée par IColumnsInfo ::GetColumnsInfo retourne DBSTATUS_S_ISNULL (au lieu des valeurs décrivant si la colonne est calculée) car elle ne peut pas être déterminée si la colonne sous-jacente est calculée.

Les ordinaux sont utilisés pour spécifier une liaison à une colonne. Une liaison est une structure qui associe un élément de la structure du consommateur à une colonne. La liaison peut lier la valeur de données, la longueur et la valeur d’état de la colonne.

Un ensemble de liaisons est rassemblé dans un accesseur. Cette opération est créée à l’aide de la méthode IAccessor ::CreateAccessor . Un accesseur peut contenir plusieurs liaisons afin que les données de plusieurs colonnes puissent être récupérées ou définies dans un seul appel. Le consommateur peut créer plusieurs accesseurs pour qu’ils correspondent à différents modèles d’utilisation dans différentes parties de l’application. Il peut créer et libérer des accesseurs pendant que l’ensemble de lignes reste en existence.

Pour extraire des lignes de la base de données, le consommateur appelle une méthode, telle que IRowset ::GetNextRows ou IRowsetLocate ::GetRowsAt. Ces opérations d’extraction placent les données de ligne du serveur dans la mémoire tampon de ligne du fournisseur. Le consommateur n’a pas d’accès direct à la mémoire tampon de ligne du fournisseur. Le consommateur utilise IRowset ::GetData pour copier des données de la mémoire tampon du fournisseur vers la mémoire tampon du consommateur et IRowsetChange ::SetData pour copier les modifications de données de la mémoire tampon du consommateur vers la mémoire tampon du fournisseur.

Le consommateur appelle la méthode GetData et transmet le handle à une ligne, le handle à un accesseur et un pointeur vers une mémoire tampon allouée au consommateur. GetData convertit les données et retourne les colonnes spécifiées dans les liaisons utilisées pour créer l’accesseur. Le consommateur peut appeler GetData plusieurs fois pour une ligne, à l’aide de différents accesseurs et mémoires tampons. Par conséquent, le consommateur peut obtenir plusieurs copies des mêmes données.

Les données provenant de colonnes de longueur variable peuvent être traitées de plusieurs façons. Tout d’abord, ces colonnes peuvent être liées à une section finie de la structure du consommateur. Cela provoque la troncation lorsque la longueur des données dépasse la longueur de la mémoire tampon. Le consommateur peut déterminer que la troncation s’est produite en vérifiant l’état DBSTATUS_S_TRUNCATED. La longueur retournée est toujours la longueur réelle en octets, afin que le consommateur puisse également déterminer la quantité de données tronquées.

Lorsque le consommateur a terminé d’extraire ou de mettre à jour des lignes, il les libère avec la méthode ReleaseRows . Cela libère les ressources de la copie des lignes de l’ensemble de lignes et rend la place pour les nouvelles lignes. Le consommateur peut ensuite répéter son cycle d’extraction ou de création de lignes et accéder aux données dans celles-ci.

Lorsque le consommateur est terminé avec l’ensemble de lignes, il appelle la méthode IAccessor ::ReleaseAccessor pour libérer n’importe quel accesseur. Elle appelle la méthode IUnknown ::Release sur toutes les interfaces exposées par l’ensemble de lignes pour libérer l’ensemble de lignes. Lorsque l’ensemble de lignes est libéré, il force la libération de toutes les lignes ou accesseurs restants que le consommateur peut contenir.

Dans cette section

Voir aussi

Ensembles de lignes