Partage via


Fonction SQLColumns

Conformité
Version introduite : Conformité aux normes ODBC 1.0 : Groupe ouvert

Résumé
SQLColumns retourne la liste des noms de colonnes dans les tables spécifiées. Le pilote retourne ces informations sous la forme d’un jeu de résultats sur l’InstructionHandle spécifiée.

Syntaxe

  
SQLRETURN SQLColumns(  
     SQLHSTMT       StatementHandle,  
     SQLCHAR *      CatalogName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      SchemaName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      TableName,  
     SQLSMALLINT    NameLength3,  
     SQLCHAR *      ColumnName,  
     SQLSMALLINT    NameLength4);  

Arguments

StatementHandle
[Entrée] Handle d’instruction.

CatalogName
[Entrée] Nom du catalogue. Si un pilote prend en charge les catalogues pour certaines tables, mais pas pour d’autres, par exemple lorsque le pilote récupère des données à partir de différents SGBD, une chaîne vide («  ») indique les tables qui n’ont pas de catalogues. CatalogName ne peut pas contenir un modèle de recherche de chaîne.

Notes

Si l’attribut d’instruction SQL_ATTR_METADATA_ID a la valeur SQL_TRUE, CatalogName est traité comme un identificateur et sa casse n’est pas significative. S’il est SQL_FALSE, CatalogName est un argument ordinaire ; il est traité littéralement, et son cas est significatif. Pour plus d’informations, consultez Arguments dans les fonctions de catalogue.

NameLength1
[Entrée] Longueur en caractères de *CatalogName.

SchemaName
[Entrée] Modèle de recherche de chaîne pour les noms de schéma. Si un pilote prend en charge les schémas pour certaines tables, mais pas pour d’autres, par exemple lorsque le pilote récupère des données à partir de différents SGBD, une chaîne vide (« ») indique les tables qui n’ont pas de schémas.

Notes

Si l’attribut d’instruction SQL_ATTR_METADATA_ID a la valeur SQL_TRUE, SchemaName est traité comme un identificateur et sa casse n’est pas significative. S’il est SQL_FALSE, SchemaName est un argument de valeur de modèle ; il est traité littéralement, et son cas est significatif.

NameLength2
[Entrée] Longueur en caractères de *SchemaName.

TableName
[Entrée] Modèle de recherche de chaîne pour les noms de table.

Notes

Si l’attribut d’instruction SQL_ATTR_METADATA_ID a la valeur SQL_TRUE, TableName est traité comme un identificateur et sa casse n’est pas significative. S’il est SQL_FALSE, TableName est un argument de valeur de modèle ; il est traité littéralement, et son cas est significatif.

NameLength3
[Entrée] Longueur en caractères de *TableName.

ColumnName
[Entrée] Modèle de recherche de chaîne pour les noms de colonnes.

Notes

Si l’attribut d’instruction SQL_ATTR_METADATA_ID a la valeur SQL_TRUE, ColumnName est traité comme un identificateur et sa casse n’est pas significative. S’il est SQL_FALSE, ColumnName est un argument de valeur de modèle ; il est traité littéralement, et son cas est significatif.

NameLength4
[Entrée] Longueur en caractères de *ColumnName.

Retours

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR ou SQL_INVALID_HANDLE.

Diagnostics

Lorsque SQLColumns retourne SQL_ERROR ou SQL_SUCCESS_WITH_INFO, une valeur SQLSTATE associée peut être obtenue en appelant SQLGetDiagRec avec un HandleType de SQL_HANDLE_STMT et un Handle of StatementHandle. Le tableau suivant répertorie les valeurs SQLSTATE généralement retournées par SQLColumns et explique chacune d’elles dans le contexte de cette fonction ; la notation « (DM) » précède les descriptions de SQLSTATEs retournées par le Gestionnaire de pilotes. Le code de retour associé à chaque valeur SQLSTATE est SQL_ERROR, sauf indication contraire.

SQLSTATE Error Description
01000 Avertissement général Message d’information spécifique au pilote. (La fonction retourne SQL_SUCCESS_WITH_INFO.)
08S01 Échec de la liaison de communication La liaison de communication entre le pilote et la source de données à laquelle le pilote a été connecté a échoué avant que la fonction n’ait terminé le traitement.
24 000 État de curseur non valide Un curseur a été ouvert sur l’InstructionHandle et SQLFetchScroll a été appelé. Cette erreur est retournée par le Gestionnaire de pilotes si SQLFetch ou SQLFetchScroll n’a pas retourné SQL_NO_DATA, et est retournée par le pilote si SQLFetch ou SQLFetchScroll a retourné SQL_NO_DATA.

Un curseur a été ouvert sur l’InstructionHandle, mais SQLFetchScroll n’avait pas été appelé.
40001 Échec de sérialisation La transaction a été annulée en raison d’un blocage des ressources avec une autre transaction.
40003 Saisie semi-automatique d’instruction inconnue La connexion associée a échoué pendant l’exécution de cette fonction et l’état de la transaction ne peut pas être déterminé.
HY000 Erreur générale Une erreur s’est produite pour laquelle il n’y avait pas de SQLSTATE spécifique et pour laquelle aucun SQLSTATE spécifique à l’implémentation n’a été défini. Le message d’erreur retourné par SQLGetDiagRec dans la mémoire tampon *MessageText décrit l’erreur et sa cause.
HY001 Erreur d’allocation de mémoire Le pilote n’a pas pu allouer la mémoire nécessaire pour prendre en charge l’exécution ou l’achèvement de la fonction.
HY008 Opération annulée Le traitement asynchrone a été activé pour l’instruction StatementHandle. La fonction a été appelée et, avant de terminer l’exécution, SQLCancel ou SQLCancelHandle a été appelé sur l’InstructionHandle. Ensuite, la fonction a été appelée à nouveau sur l’InstructionHandle.

La fonction a été appelée et, avant de terminer l’exécution, SQLCancel ou SQLCancelHandle a été appelé sur l’InstructionHandle à partir d’un autre thread dans une application multithread.
HY009 Utilisation non valide du pointeur null L’attribut d’instruction SQL_ATTR_METADATA_ID a été défini sur SQL_TRUE, l’argument CatalogName était un pointeur null et le SQL_CATALOG_NAME InfoType retourne que les noms de catalogue sont pris en charge.

(DM) L’attribut d’instruction SQL_ATTR_METADATA_ID a été défini sur SQL_TRUE, et l’argument SchemaName, TableName ou ColumnName était un pointeur null.
HY010 Erreur de séquence de fonction (DM) Une fonction d’exécution asynchrone a été appelée pour le handle de connexion associé à l’InstructionHandle. Cette fonction asynchrone était toujours en cours d’exécution lorsque la fonction SQLColumns a été appelée.

(DM) SQLExecute, SQLExecDirect ou SQLMoreResults a été appelé pour l’instruction StatementHandle et a retourné SQL_PARAM_DATA_AVAILABLE. Cette fonction a été appelée avant la récupération des données pour tous les paramètres diffusés.

(DM) Une fonction d’exécution asynchrone (et non celle-ci) a été appelée pour l’InstructionHandle et s’exécutait toujours lorsque cette fonction a été appelée.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations ou SQLSetPos a été appelé pour l’InstructionHandle et a renvoyé SQL_NEED_DATA. Cette fonction a été appelée avant l’envoi des données pour toutes les colonnes ou paramètres de données au moment de l’exécution.
HY013 Erreur de gestion de la mémoire L’appel de fonction n’a pas pu être traité, car les objets de mémoire sous-jacents n’ont pas pu être consultés, peut-être en raison de conditions de mémoire insuffisantes.
HY090 Chaîne ou longueur de mémoire tampon non valide (DM) La valeur de l’un des arguments de longueur de nom était inférieure à 0, mais non égale à SQL_NTS.
La valeur de l’un des arguments de longueur de nom a dépassé la valeur de longueur maximale du catalogue ou du nom correspondant. La longueur maximale de chaque catalogue ou nom peut être obtenue en appelant SQLGetInfo avec les valeurs InfoType . (Voir « Commentaires »).
HY117 La connexion est suspendue en raison d’un état de transaction inconnu. Seules les fonctions de déconnexion et de lecture seule sont autorisées. (DM) Pour plus d’informations sur l’état suspendu, consultez FONCTION SQLEndTran.
HYC00 Fonctionnalité facultative non implémentée Un nom de catalogue a été spécifié et le pilote ou la source de données ne prend pas en charge les catalogues.

Un nom de schéma a été spécifié et le pilote ou la source de données ne prend pas en charge les schémas.

Un modèle de recherche de chaîne a été spécifié pour le nom de schéma, le nom de la table ou le nom de colonne, et la source de données ne prend pas en charge les modèles de recherche pour un ou plusieurs de ces arguments.

La combinaison des paramètres actuels de l’SQL_ATTR_CONCURRENCY et des attributs d’instruction SQL_ATTR_CURSOR_TYPE n’était pas prise en charge par le pilote ou la source de données.

L’attribut d’instruction SQL_ATTR_USE_BOOKMARKS a été défini sur SQL_UB_VARIABLE et l’attribut d’instruction SQL_ATTR_CURSOR_TYPE a été défini sur un type de curseur pour lequel le pilote ne prend pas en charge les signets.
HYT00 Délai expiré Le délai d’expiration de la requête a expiré avant que la source de données ne retourne le jeu de résultats. Le délai d’expiration est défini via SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
HYT01 Délai d’attente de la connexion expiré Le délai d’expiration de la connexion a expiré avant que la source de données réponde à la demande. La période de délai d’expiration de la connexion est définie via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Le pilote ne prend pas en charge cette fonction (DM) Le pilote associé à l’InstructionHandle ne prend pas en charge la fonction.
IM017 L’interrogation est désactivée en mode de notification asynchrone Chaque fois que le modèle de notification est utilisé, l’interrogation est désactivée.
IM018 SQLCompleteAsync n’a pas été appelé pour effectuer l’opération asynchrone précédente sur ce handle. Si l’appel de fonction précédent sur le handle retourne SQL_STILL_EXECUTING et si le mode de notification est activé, SQLCompleteAsync doit être appelé sur le handle pour effectuer un post-traitement et terminer l’opération.

Commentaires

Cette fonction est généralement utilisée avant l’exécution de l’instruction pour récupérer des informations sur les colonnes d’une ou plusieurs tables à partir du catalogue de la source de données. SQLColumns peut être utilisé pour récupérer des données pour tous les types d’éléments retournés par SQLTables. En plus des tables de base, cela peut inclure (mais sans s’y limiter) des vues, des synonymes, des tables système, etc. En revanche, les fonctions SQLColAttribute et SQLDescribeCol décrivent les colonnes d’un jeu de résultats et la fonction SQLNumResultCols retourne le nombre de colonnes dans un jeu de résultats. Pour plus d’informations, consultez Utilisations des données de catalogue.

Notes

Pour plus d’informations sur l’utilisation générale, les arguments et les données retournées des fonctions de catalogue ODBC, consultez Fonctions de catalogue.

SQLColumns retourne les résultats sous la forme d’un jeu de résultats standard, classé par TABLE_CAT, TABLE_SCHEM, TABLE_NAME et ORDINAL_POSITION.

Notes

Quand une application fonctionne avec odbc 2. x pilote, aucune colonne ORDINAL_POSITION n’est retournée dans le jeu de résultats. Par conséquent, lors de l’utilisation d’ODBC 2. x pilotes, l’ordre des colonnes de la liste de colonnes retournée par SQLColumns n’est pas nécessairement identique à l’ordre des colonnes retournées lorsque l’application exécute une instruction SELECT sur toutes les colonnes de cette table.

Notes

SQLColumns peut ne pas retourner toutes les colonnes. Par exemple, un pilote peut ne pas renvoyer d’informations sur les pseudo-colonnes, telles que Oracle ROWID. Les applications peuvent utiliser n’importe quelle colonne valide, qu’elle soit retournée par SQLColumns.

Certaines colonnes qui peuvent être retournées par SQLStatistics ne sont pas retournées par SQLColumns. Par exemple, SQLColumns ne retourne pas les colonnes d’un index créé sur une expression ou un filtre, comme SALARY + BENEFITS ou DEPT = 0012.

Les longueurs des colonnes VARCHAR ne sont pas indiquées dans le tableau ; les longueurs réelles dépendent de la source de données. Pour déterminer la longueur réelle des colonnes TABLE_CAT, TABLE_SCHEM, TABLE_NAME et COLUMN_NAME, une application peut appeler SQLGetInfo avec les options SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN et SQL_MAX_COLUMN_NAME_LEN.

Les colonnes suivantes ont été renommées pour ODBC 3. x. Les changements de nom de colonne n’affectent pas la compatibilité descendante, car les applications se lient par numéro de colonne.

Colonne ODBC 2.0 ODBC 3. colonne x
TABLE_QUALIFIER TABLE_CAT
TABLE_OWNER TABLE_SCHEM
PRECISION COLUMN_SIZE
LENGTH BUFFER_LENGTH
SCALE DECIMAL_DIGITS
RADIX NUM_PREC_RADIX

Les colonnes suivantes ont été ajoutées au jeu de résultats retourné par SQLColumns pour ODBC 3. x :

CHAR_OCTET_LENGTH
COLUMN_DEF

IS_NULLABLE
ORDINAL_POSITION

SQL_DATA_TYPE
SQL_DATETIME_SUB

Le tableau suivant répertorie les colonnes du jeu de résultats. Des colonnes supplémentaires au-delà de la colonne 18 (IS_NULLABLE) peuvent être définies par le pilote. Une application doit accéder à des colonnes spécifiques au pilote en comptant vers le bas à partir de la fin du jeu de résultats au lieu de spécifier une position ordinale explicite. Pour plus d’informations, consultez Données retournées par les fonctions de catalogue.

Nom de la colonne Colonne

nombre
Type de données Commentaires
TABLE_CAT (ODBC 1.0) 1 Varchar Nom du catalogue ; NULL s’il n’est pas applicable à la source de données. Si un pilote prend en charge les catalogues pour certaines tables, mais pas pour d’autres, par exemple lorsque le pilote récupère des données à partir de différents SGBD, il retourne une chaîne vide (« ») pour les tables qui n’ont pas de catalogues.
TABLE_SCHEM (ODBC 1.0) 2 Varchar Nom du schéma ; NULL s’il n’est pas applicable à la source de données. Si un pilote prend en charge les schémas pour certaines tables, mais pas pour d’autres, par exemple lorsque le pilote récupère des données à partir de différents SGBD, il retourne une chaîne vide (« ») pour les tables qui n’ont pas de schémas.
TABLE_NAME (ODBC 1.0) 3 Varchar not NULL Nom de la table.
COLUMN_NAME (ODBC 1.0) 4 Varchar not NULL Nom de la colonne. Le pilote retourne une chaîne vide pour une colonne qui n’a pas de nom.
DATA_TYPE (ODBC 1.0) 5 Smallint non NULL Type de données SQL. Il peut s’agir d’un type de données ODBC SQL ou d’un type de données SQL spécifique au pilote. Pour les types de données datetime et interval, cette colonne retourne le type de données concis (par exemple, SQL_TYPE_DATE ou SQL_INTERVAL_YEAR_TO_MONTH, au lieu du type de données nonconcis comme SQL_DATETIME ou SQL_INTERVAL). Pour obtenir la liste des types de données ODBC SQL valides, consultez Types de données SQL dans l’Annexe D : Types de données. Pour plus d’informations sur les types de données SQL spécifiques aux pilotes, consultez la documentation du pilote.

Types de données retournés pour ODBC 3. x et ODBC 2. x applications peuvent être différentes. Pour plus d’informations, consultez Compatibilité descendante et conformité aux normes.
TYPE_NAME (ODBC 1.0) 6 Varchar not NULL Nom du type de données dépendant de la source de données ; par exemple, « CHAR », « VARCHAR », « MONEY », « LONG VARBINAR » ou « CHAR ( ) FOR BIT DATA ».
COLUMN_SIZE (ODBC 1.0) 7 Integer Si DATA_TYPE est SQL_CHAR ou SQL_VARCHAR, cette colonne contient la longueur maximale en caractères de la colonne. Pour les types de données datetime, il s’agit du nombre total de caractères requis pour afficher la valeur lors de sa conversion en caractères. Pour les types de données numériques, il s’agit du nombre total de chiffres ou du nombre total de bits autorisés dans la colonne, en fonction de la colonne NUM_PREC_RADIX. Pour les types de données d’intervalle, il s’agit du nombre de caractères dans la représentation en caractères du littéral d’intervalle (tel que défini par la précision de début d’intervalle, voir Interval Data Type Length dans l’Annexe D : Types de données). Pour plus d’informations, consultez Taille de colonne, Chiffres décimaux, Longueur de transfert d’octet et Taille d’affichage dans l’Annexe D : Types de données.
BUFFER_LENGTH (ODBC 1.0) 8 Integer Longueur en octets des données transférées sur une opération SQLGetData, SQLFetch ou SQLFetchScroll si SQL_C_DEFAULT est spécifié. Pour les données numériques, cette taille peut différer de la taille des données stockées sur la source de données. Cette valeur peut différer de COLUMN_SIZE colonne pour les données de caractères. Pour plus d’informations sur la longueur, consultez Taille de colonne, Chiffres décimaux, Longueur de transfert d’octet et Taille d’affichage dans l’Annexe D : Types de données.
DECIMAL_DIGITS (ODBC 1.0) 9 Smallint Nombre total de chiffres significatifs à droite de la virgule décimale. Par SQL_TYPE_TIME et SQL_TYPE_TIMESTAMP, cette colonne contient le nombre de chiffres dans le composant fractionnaire secondes. Pour les autres types de données, il s’agit des chiffres décimaux de la colonne sur la source de données. Pour les types de données d’intervalle qui contiennent un composant de temps, cette colonne contient le nombre de chiffres à droite de la virgule décimale (fractions de secondes). Pour les types de données d’intervalle qui ne contiennent pas de composant de temps, cette colonne est 0. Pour plus d’informations sur les chiffres décimaux, consultez Taille de colonne, Chiffres décimaux, Longueur de transfert d’octets et Taille d’affichage dans l’Annexe D : Types de données. Null est retourné pour les types de données où DECIMAL_DIGITS n’est pas applicable.
NUM_PREC_RADIX (ODBC 1.0) 10 Smallint Pour les types de données numériques, 10 ou 2. S’il est 10, les valeurs dans COLUMN_SIZE et DECIMAL_DIGITS donnent le nombre de chiffres décimaux autorisés pour la colonne. Par exemple, une colonne DECIMAL(12,5) renvoie une NUM_PREC_RADIX de 10, une COLUMN_SIZE de 12 et une DECIMAL_DIGITS de 5 ; une colonne FLOAT peut retourner une NUM_PREC_RADIX de 10, une COLUMN_SIZE de 15 et une DECIMAL_DIGITS NULL.

S’il est 2, les valeurs dans COLUMN_SIZE et DECIMAL_DIGITS donnent le nombre de bits autorisé dans la colonne. Par exemple, une colonne FLOAT peut retourner un RADIX de 2, un COLUMN_SIZE de 53 et un DECIMAL_DIGITS null.

Null est retourné pour les types de données pour lesquels NUM_PREC_RADIX n’est pas applicable.
NULLABLE (ODBC 1.0) 11 Smallint non NULL SQL_NO_NULLS si la colonne n’a pas pu inclure de valeurs NULL.

SQL_NULLABLE si la colonne accepte des valeurs NULL.

SQL_NULLABLE_UNKNOWN si l’on ne sait pas si la colonne accepte les valeurs NULL.

La valeur retournée pour cette colonne diffère de la valeur retournée pour la colonne IS_NULLABLE. La colonne NULLABLE indique avec certitude qu’une colonne peut accepter des VALEURS NULL, mais ne peut pas indiquer avec certitude qu’une colonne n’accepte pas les VALEURS NULL. La colonne IS_NULLABLE indique avec certitude qu’une colonne ne peut pas accepter les VALEURS NULL, mais ne peut pas indiquer avec certitude qu’une colonne accepte les VALEURS NULL.
REMARQUES (ODBC 1.0) 12 Varchar Description de la colonne.
COLUMN_DEF (ODBC 3.0) 13 Varchar Valeur par défaut de la colonne. La valeur de cette colonne doit être interprétée comme une chaîne si elle est placée entre guillemets.

Si NULL a été spécifié comme valeur par défaut, cette colonne est le mot NULL, non placé entre guillemets. Si la valeur par défaut ne peut pas être représentée sans troncation, cette colonne contient TRUNCATED, sans placer de guillemets uniques. Si aucune valeur par défaut n’a été spécifiée, cette colonne a la valeur NULL.

La valeur de COLUMN_DEF peut être utilisée pour générer une nouvelle définition de colonne, sauf lorsqu’elle contient la valeur TRUNCATED.
SQL_DATA_TYPE (ODBC 3.0) 14 Smallint non NULL Type de données SQL, tel qu’il apparaît dans le champ d’enregistrement SQL_DESC_TYPE dans l’IRD. Il peut s’agir d’un type de données ODBC SQL ou d’un type de données SQL spécifique au pilote. Cette colonne est identique à la colonne DATA_TYPE, à l’exception des types de données datetime et interval. Cette colonne retourne le type de données nonconcis (par exemple, SQL_DATETIME ou SQL_INTERVAL), au lieu du type de données concis (par exemple, SQL_TYPE_DATE ou SQL_INTERVAL_YEAR_TO_MONTH) pour les types de données datetime et interval. Si cette colonne retourne SQL_DATETIME ou SQL_INTERVAL, le type de données spécifique peut être déterminé à partir de la colonne SQL_DATETIME_SUB. Pour obtenir la liste des types de données ODBC SQL valides, consultez Types de données SQL dans l’Annexe D : Types de données. Pour plus d’informations sur les types de données SQL spécifiques aux pilotes, consultez la documentation du pilote.

Types de données retournés pour ODBC 3. x et ODBC 2. x applications peuvent être différentes. Pour plus d’informations, consultez Compatibilité descendante et conformité aux normes.
SQL_DATETIME_SUB (ODBC 3.0) 15 Smallint Code de sous-type pour les types de données datetime et interval. Pour les autres types de données, cette colonne retourne une valeur NULL. Pour plus d’informations sur les sous-codes datetime et interval, consultez « SQL_DESC_DATETIME_INTERVAL_CODE » dans SQLSetDescField.
CHAR_OCTET_LENGTH (ODBC 3.0) 16 Integer Longueur maximale en octets d’une colonne de type caractère ou de type de données binaire. Pour tous les autres types de données, cette colonne retourne une valeur NULL.
ORDINAL_POSITION (ODBC 3.0) 17 Entier non NULL Position ordinale de la colonne dans la table. La première colonne de la table est le numéro 1.
IS_NULLABLE (ODBC 3.0) 18 Varchar « NO » si la colonne n’inclut pas de NCL.

« OUI » si la colonne peut inclure des NCL.

Cette colonne renvoie une chaîne de longueur zéro si la possibilité de valeurs Null n'est pas connue.

Les règles ISO sont utilisées pour déterminer la possibilité de valeur Null. Un SGBD compatible avec la norme ISO SQL ne peut pas renvoyer de chaîne vide.

La valeur retournée pour cette colonne diffère de la valeur retournée pour la colonne NULLABLE. (Voir la description de la colonne NULLABLE.)

Exemple de code

Dans l’exemple suivant, une application déclare des mémoires tampons pour le jeu de résultats retourné par SQLColumns. Il appelle SQLColumns pour renvoyer un jeu de résultats qui décrit chaque colonne de la table EMPLOYEE. Il appelle ensuite SQLBindCol pour lier les colonnes du jeu de résultats aux mémoires tampons. Enfin, l’application extrait chaque ligne de données avec SQLFetch et les traite.

// SQLColumns_Function.cpp  
// compile with: ODBC32.lib  
#include <windows.h>  
#include <sqlext.h>  
#define STR_LEN 128 + 1  
#define REM_LEN 254 + 1  
  
// Declare buffers for result set data  
SQLCHAR szSchema[STR_LEN];  
SQLCHAR szCatalog[STR_LEN];  
SQLCHAR szColumnName[STR_LEN];  
SQLCHAR szTableName[STR_LEN];  
SQLCHAR szTypeName[STR_LEN];  
SQLCHAR szRemarks[REM_LEN];  
SQLCHAR szColumnDefault[STR_LEN];  
SQLCHAR szIsNullable[STR_LEN];  
  
SQLINTEGER ColumnSize;  
SQLINTEGER BufferLength;  
SQLINTEGER CharOctetLength;  
SQLINTEGER OrdinalPosition;  
  
SQLSMALLINT DataType;  
SQLSMALLINT DecimalDigits;  
SQLSMALLINT NumPrecRadix;  
SQLSMALLINT Nullable;  
SQLSMALLINT SQLDataType;  
SQLSMALLINT DatetimeSubtypeCode;  
  
SQLHSTMT hstmt = NULL;  
  
// Declare buffers for bytes available to return  
SQLINTEGER cbCatalog;  
SQLINTEGER cbSchema;  
SQLINTEGER cbTableName;  
SQLINTEGER cbColumnName;  
SQLINTEGER cbDataType;  
SQLINTEGER cbTypeName;  
SQLINTEGER cbColumnSize;  
SQLLEN cbBufferLength;  
SQLINTEGER cbDecimalDigits;  
SQLINTEGER cbNumPrecRadix;  
SQLINTEGER cbNullable;  
SQLINTEGER cbRemarks;  
SQLINTEGER cbColumnDefault;  
SQLINTEGER cbSQLDataType;  
SQLINTEGER cbDatetimeSubtypeCode;  
SQLINTEGER cbCharOctetLength;  
SQLINTEGER cbOrdinalPosition;  
SQLINTEGER cbIsNullable;  
  
int main() {  
   SQLHENV henv;  
   SQLHDBC hdbc;  
   SQLHSTMT hstmt = 0;  
   SQLRETURN retcode;  
  
   retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);   
   retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);   
   retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);  
   retcode = SQLConnect(hdbc, (SQLCHAR*) "Northwind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
   retcode = SQLColumns(hstmt, NULL, 0, NULL, 0, (SQLCHAR*)"CUSTOMERS", SQL_NTS, NULL, 0);  
  
   if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {  
      // Bind columns in result set to buffers  
      SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&cbCatalog);  
      SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &cbSchema);  
      SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&cbTableName);  
      SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &cbColumnName);  
      SQLBindCol(hstmt, 5, SQL_C_SSHORT, &DataType, 0, &cbDataType);  
      SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &cbTypeName);  
      SQLBindCol(hstmt, 7, SQL_C_SLONG, &ColumnSize, 0, &cbColumnSize);  
      SQLBindCol(hstmt, 8, SQL_C_SLONG, &BufferLength, 0, &cbBufferLength);  
      SQLBindCol(hstmt, 9, SQL_C_SSHORT, &DecimalDigits, 0, &cbDecimalDigits);  
      SQLBindCol(hstmt, 10, SQL_C_SSHORT, &NumPrecRadix, 0, &cbNumPrecRadix);  
      SQLBindCol(hstmt, 11, SQL_C_SSHORT, &Nullable, 0, &cbNullable);  
      SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &cbRemarks);  
      SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &cbColumnDefault);  
      SQLBindCol(hstmt, 14, SQL_C_SSHORT, &SQLDataType, 0, &cbSQLDataType);  
      SQLBindCol(hstmt, 15, SQL_C_SSHORT, &DatetimeSubtypeCode, 0, &cbDatetimeSubtypeCode);  
      SQLBindCol(hstmt, 16, SQL_C_SLONG, &CharOctetLength, 0, &cbCharOctetLength);  
      SQLBindCol(hstmt, 17, SQL_C_SLONG, &OrdinalPosition, 0, &cbOrdinalPosition);  
      SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &cbIsNullable);  
  
      while (SQL_SUCCESS == retcode) {  
         retcode = SQLFetch(hstmt);  
         /*  
         if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO)  
            0;   // show_error();  
         if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)  
            0;   // Process fetched data  
         else  
            break;  
        */  
      }  
   }  
}  
Pour obtenir des informations sur Consultez
Liaison d’une mémoire tampon à une colonne dans un jeu de résultats Fonction SQLBindCol
Annulation du traitement des instructions SQLCancel, fonction
Retour de privilèges pour une colonne ou des colonnes Fonction SQLColumnPrivileges
Extraction d’un bloc de données ou défilement d’un jeu de résultats Fonction SQLFetchScroll
Extraction de plusieurs lignes de données SQLFetch, fonction
Colonnes retournées qui identifient une ligne de manière unique, ou colonnes automatiquement mises à jour par une transaction Fonction SQLSpecialColumns
Statistiques et index de table retournés Fonction SQLStatistics
Renvoi d’une liste de tables dans une source de données Fonction SQLTables
Retour de privilèges pour une ou plusieurs tables Fonction SQLTablePrivileges

Voir aussi

Informations de référence sur l’API ODBC
Fichiers d’en-tête ODBC