Fonction SQLBindCol (CLI)-Liaison d'une colonne à une variable d'application ou à un releveur de coordonnées LOB
L'application peut associer (lier) des colonnes dans un ensemble de résultats à des variables de type de données C et associer (lier) des colonnes LOB dans un ensemble de résultats à des releveurs de coordonnées LOB.
Spécification :
- Interface de ligne de commande 1.1
- ODBC 1.0
- Interface de ligne de commande ISO
- Variables d'application ou tableaux de variables d'application (tampons de stockage), pour tous les types de données C. Les données sont transférées du SGBD vers l'application lorsque SQLFetch() ou SQLFetchScroll() est appelé. La conversion de données peut se produire lorsque les données sont transférées.
- Un releveur de coordonnées LOB, pour les colonnes LOB. Un releveur de coordonnées LOB, et non les données elles-mêmes, est transféré du système de gestion de base de données vers l'application lorsque SQLFetch() est appelé.
Les colonnes LOB peuvent également être liées directement à un fichier à l'aide de SQLBindFileToCol().
SQLBindCol() est appelé une fois pour chaque colonne de l'ensemble de résultats que l'application doit extraire.
En général, SQLPrepare(), SQLExecDirect() ou l'une des fonctions de schéma est appelée avant cette fonction et SQLFetch(), SQLFetchScroll(), SQLBulkOperations()ou SQLSetPos() est appelé après. Des attributs de colonne peuvent également être nécessaires avant d'appeler SQLBindCol()et peuvent être obtenus à l'aide de SQLDescribeCol() ou SQLColAttribute().
Syntaxe
SQLRETURN SQLBindCol (
SQLHSTMT StatementHandle, /* hstmt */
SQLUSMALLINT ColumnNumber, /* icol */
SQLSMALLINT TargetType, /* fCType */
SQLPOINTER TargetValuePtr, /* rgbValue */
SQLLEN BufferLength, /* cbValueMax */
SQLLEN *StrLen_or_IndPtr); /* *pcbValue */ arguments de fonctions
| Type de données | Argument | Utilisation | Description |
|---|---|---|---|
| SQLHSTMT | StatementHandle | entrée | Descripteur d'inscription |
| SQLUSMALLINT | ColumnNumber | entrée | Numéro identifiant la colonne. Les colonnes sont numérotées de manière séquentielle, de gauche à droite.
|
| SQLSMALLINT | TargetType | entrée | Type de données C pour le numéro de colonne ColumnNumber dans l'ensemble de résultats. Lorsque l'application extrait des données de la source de données, elle convertit les données en ce type C. Lorsque vous utilisez SQLBulkOperations() ou SQLSetPos(), le pilote convertit les données de ce type de données C lors de l'envoi d'informations à la source de données. Les types suivants sont pris en charge:
La spécification de SQL_C_DEFAULT entraîne le transfert des données vers le type de données C par défaut. |
| POINT_SQL | TargetValuePtr | entrée / sortie (différé) | Pointeur vers une mémoire tampon ou un tableau de mémoires tampon avec une liaison par colonne ou par ligne, où l' interface de ligne de commande permet de stocker les données de colonne ou le releveur de coordonnées LOB lors de l'extraction. Cette mémoire tampon est utilisée pour renvoyer des données lorsque l'une des fonctions suivantes est appelée: Sinon, Si TargetValuePtr est null, la colonne n'est pas liée. Toutes les colonnes peuvent être déliées à l'aide d'un appel à |
| SQLLEN | BufferLength | entrée | Taille en octets de la mémoire tampon TargetValuePtr disponible pour stocker les données de colonne ou le releveur de coordonnées LOB. Si TargetType indique une chaîne binaire ou de caractères (simple ou double octet) ou est SQL_C_DEFAULT pour une colonne renvoyant des données de longueur variable, BufferLength doit être > 0, sinon une erreur sera renvoyée. Notez que pour les données de type caractère, le pilote compte le caractère de fin NULL et que, par conséquent, de l'espace doit lui être alloué. Pour tous les autres types de données, cet argument est ignoré. |
| SQLLEN * | StrLen_or_IndPtr | entrée / sortie (différé) | Pointeur vers une valeur (ou un tableau de valeurs) qui indique le nombre d'octets que l' interface de ligne de commande peut renvoyer dans la mémoire tampon TargetValuePtr . Si TargetType est un releveur de coordonnées LOB, la taille du releveur de coordonnées est renvoyée, et non celle des données LOB. Cette mémoire tampon est utilisée pour renvoyer des données lorsque l'une des fonctions suivantes est appelée: Sinon, SQLFetch() renvoie SQL_NULL_DATA dans cet argument si la valeur de données de la colonne est null. Cette valeur de pointeur doit être unique pour chaque colonne liée ou NULL. Une valeur de SQL_COLUMN_IGNORE, SQL_NTS, SQL_NULL_DATA ou la longueur des données peut être définie pour être utilisée avec SQL_NO_LENGTH peut également être renvoyé. Pour plus d'informations, reportez-vous à la section Utilisation. |
- Pour cette fonction, TargetValuePtr et StrLen_or_IndPtr sont des sorties différées, ce qui signifie que les emplacements de stockage que ces pointeurs pointent ne sont pas mis à jour tant qu'une ligne d'ensemble de résultats n'est pas extraite. Par conséquent, les emplacements référencés par ces pointeurs doivent rester valides jusqu'à ce que SQLFetch() ou SQLFetchScroll() soit appelé. Par exemple, si SQLBindCol() est appelé dans une fonction locale, SQLFetch() doit être appelé à partir de la même portée de la fonction ou la mémoire tampon TargetValuePtr doit être allouée comme étant statique ou globale.
- L' interface de ligne de commande pourra optimiser l'extraction de données pour tous les types de données de longueur variable si TargetValuePtr est placé consécutivement en mémoire après StrLen_or_IndPtr.
Utilisation
Appelez SQLBindCol() une fois pour chaque colonne de l'ensemble de résultats pour laquelle les données ou, pour les colonnes LOB, le releveur de coordonnées LOB doivent être extraits. Lorsque SQLFetch() ou SQLFetchScroll() est appelé pour extraire des données de l'ensemble de résultats, les données de chacune des colonnes liées sont placées dans les emplacements affectés par les pointeurs TargetValuePtr et StrLen_or_IndPtr . Lorsque l'attribut d'instruction SQL_ATTR_ROW_ARRAY_SIZE est supérieur à 1, TargetType doit faire référence à un tableau de mémoires tampon. Si TargetType est un releveur de coordonnées LOB, une valeur de releveur de coordonnées est renvoyée, et non les données LOB réelles. Le releveur de coordonnées LOB fait référence à la totalité de la valeur de données dans la colonne LOB.
Si une application CLI ne fournit pas de mémoire tampon de sortie pour une colonne LOB à l'aide de la fonction SQLBindCol() , le client de serveur de donnéesIBM® demande, par défaut, un releveur de coordonnées LOB pour le compte de l'application pour chaque colonne LOB dans les ensembles de résultats.
- Les numéros de colonne commencent à 1 si les signets ne sont pas utilisés (attribut d'instruction SQL_ATTR_USE_BOOKMARKS défini sur SQL_UB_OFF).
- Les numéros de colonne commencent à 0 si des signets sont utilisés (l'attribut d'instruction défini sur SQL_UB_ON).
Une fois que les colonnes ont été liées, lors des extractions suivantes, l'application peut modifier la liaison de ces colonnes ou lier des colonnes précédemment non liées en appelant SQLBindCol(). La nouvelle liaison ne s'applique pas aux données déjà extraites ; elle sera utilisée lors de l'extraction suivante. Pour annuler la liaison d'une seule colonne (y compris les colonnes liées par SQLBindFileToCol()), appelez SQLBindCol() avec le pointeur TargetValuePtr défini sur NULL. Pour annuler la liaison de toutes les colonnes, l'application doit appeler SQLFreeStmt() avec l'entrée Option définie sur SQL_UNBIND.
L'application doit s'assurer que l'espace de stockage alloué est suffisant pour que les données puissent être extraites. Si la mémoire tampon doit contenir des données de longueur variable, l'application doit allouer autant de mémoire que la longueur maximale de la colonne liée plus le caractère de fin NULL. Sinon, les données risquent d'être tronquées. Si la mémoire tampon doit contenir des données de longueur fixe, l' interface de ligne de commande suppose que la taille de la mémoire tampon correspond à la longueur du type de données C. Si la conversion de données est spécifiée, la taille requise peut être affectée.
Si une troncature de chaîne se produit, SQL_SUCCESS_WITH_INFO est renvoyé et StrLen_or_IndPtr sera défini sur la taille réelle de TargetValuePtr disponible pour être renvoyé à l'application.
La troncature est également affectée par l'attribut d'instruction SQL_ATTR_MAX_LENGTH (utilisé pour limiter la quantité de données renvoyées à l'application). L'application peut spécifier de ne pas signaler la troncature en appelant SQLSetStmtAttr() avec SQL_ATTR_MAX_LENGTH et une valeur pour la longueur maximale à renvoyer pour toutes les colonnes de longueur variable, et en allouant une mémoire tampon TargetValuePtr de même taille (plus le caractère de fin null). Si les données de colonne sont supérieures à la longueur maximale définie, SQL_SUCCESS est renvoyé lorsque la valeur est extraite et la longueur maximale, et non la longueur réelle, est renvoyée dans StrLen_or_IndPtr.
Si la colonne à lier est un type SQL_GRAPHIC, SQL_VARGRAPHIC ou SQL_LONGVARGRAPHIC, TargetType peut être défini sur SQL_C_DBCHAR ou SQL_C_CHAR. Si TargetType est SQL_C_DBCHAR, les données extraites dans la mémoire tampon TargetValuePtr seront terminées par une valeur null avec un caractère de fin null double octet. Si TargetType est SQL_C_CHAR, il n'y aura pas d'arrêt null des données. Dans les deux cas, la longueur de la mémoire tampon TargetValuePtr (BufferLength) est exprimée en unités d'octets et doit donc être un multiple de 2. Il est également possible de forcer l' interface de ligne de commande à mettre fin aux chaînes graphiques à l'aide du mot clé PATCH1 .
- Le type SQL est un type de longueur variable, et
- StrLen_or_IndPtr et TargetValuePtr sont contigus, et
- Le type de colonne est NOT NULLABLE, et
- Une troncature de chaîne s'est produite.
Descripteurs et SQLBindCol
Les sections suivantes décrivent comment SQLBindCol() interagit avec les descripteurs.
Mappages d'arguments
- Appelle SQLGetStmtAttr() pour obtenir le descripteur ARD.
- Appelle SQLGetDescField() pour obtenir la zone SQL_DESC_COUNT de ce descripteur et si la valeur de l'argument ColumnNumber dépasse la valeur de SQL_DESC_COUNT, appelle SQLSetDescField() pour augmenter la valeur de SQL_DESC_COUNT à ColumnNumber.
- Appelle SQLSetDescField() plusieurs fois pour affecter des valeurs aux zones suivantes de l'ARD:
- Définit SQL_DESC_TYPE et SQL_DESC_CONCISE_TYPE sur la valeur de TargetType.
- Définit une ou plusieurs valeurs de SQL_DESC_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE comme approprié pour TargetType.
- Définit la zone SQL_DESC_OCTET_LENGTH sur la valeur de BufferLength.
- Définit la zone SQL_DESC_DATA_PTR sur la valeur de TargetValue.
- Définit la zone SQL_DESC_INDICATOR_PTR sur la valeur de StrLen_or_IndPtr (voir le paragraphe suivant).
- Définit la zone SQL_DESC_OCTET_LENGTH_PTR sur la valeur de StrLen_or_IndPtr (voir le paragraphe suivant).
Si l'appel à SQLBindCol() échoue, le contenu des zones de descripteur qu'il aurait définies dans l'ARD n'est pas défini et la valeur de la zone SQL_DESC_COUNT de l'ARD est inchangée.
Réinitialisation implicite de la zone COUNT
SQLBindCol() définit SQL_DESC_COUNT sur la valeur de l'argument ColumnNumber uniquement lorsque la valeur de SQL_DESC_COUNT est augmentée. Si la valeur de l'argument TargetValuePtr est un pointeur null et que la valeur de l'argument ColumnNumber est égale à SQL_DESC_COUNT (c'est-à-dire lors de l'annulation de la liaison de la colonne de limite supérieure), SQL_DESC_COUNT est défini sur le numéro de la colonne de limite restante la plus élevée.
Précautions concernant SQL_C_DEFAULT
Pour extraire correctement les données de colonne, l'application doit déterminer correctement la longueur et le point de départ des données dans la mémoire tampon de l'application. Lorsque l'application spécifie un TargetTypeexplicite, les idées fausses de l'application sont facilement détectées. Toutefois, lorsque l'application spécifie un TargetType de SQL_C_DEFAULT, SQLBindCol() peut être appliqué à une colonne d'un type de données différent de celui prévu par l'application, soit à partir des modifications apportées aux métadonnées, soit en appliquant le code à une colonne différente. Dans ce cas, l'application risque de ne pas pouvoir déterminer le début ou la longueur des données de colonne extraites. Cela peut entraîner des erreurs de données non signalées ou des violations de mémoire.
Codes de retour
- SQL_REUSSITE
- SQL_SUCCESS_WITH_INFO
- ERREUR SQL
- SQL_INVALID_HANDLE
Diagnostics
| SQLSTATE | Description | Explication |
|---|---|---|
| 07009 | Index de descripteur non valide | La valeur spécifiée pour l'argument ColumnNumber a dépassé le nombre maximal de colonnes dans l'ensemble de résultats ou la valeur spécifiée était inférieure à 0. |
| 40003 08S01 | Interruption de la liaison. | Echec du lien de communication entre l'application et la source de données avant l'exécution de la fonction. |
| 58004 | Défaillance système inattendue. | Erreur système irrémédiable. |
| HY001 | Echec d'allocation mémoire. | L'interface de ligne de commande Db2® ne parvient pas à allouer la mémoire requise pour prendre en charge l'exécution ou l'exécution de la fonction. La mémoire de traitement est peut-être arrivée à saturation et l'application ne peut pas être exécutée. Vérifiez la configuration du système d'exploitation pour obtenir des informations sur les limites de la mémoire de traitement. |
| HY003 | Type de programme hors des valeurs autorisées. | TargetType n'était pas un type de données valide ou SQL_C_DEFAULT. |
| HY010 | Erreur dans la séquence de fonctions. | La fonction a été appelée lors d'une opération data-at-execute (SQLParamData(), SQLPutData()). La fonction a été appelée dans une opération SQL BEGIN COMPOUND et END COMPOUND SQL. |
| HY013 | Erreur de gestion de la mémoire inattendue. | L'interface de ligne de commande Db2 n'a pas pu accéder à la mémoire requise pour prendre en charge l'exécution ou l'exécution de la fonction. |
| HY090 | Longueur de chaîne ou taille de mémoire tampon incorrecte. | La valeur spécifiée pour l'argument BufferLength est inférieure à 1 et l'argument TargetType est SQL_C_CHAR, SQL_C_BINARY ou SQL_C_DEFAULT. |
| HYC00 | Pilote incapable de prendre en charge l'opération. | CLI reconnaît, mais ne prend pas en charge le type de données spécifié dans l'argument TargetType Un type de données C de releveur de coordonnées LOB a été spécifié, mais le serveur connecté ne prend pas en charge les types de données LOB. |
Remarque: des messages de diagnostic supplémentaires relatifs aux colonnes liées peuvent être signalés lors de l'extraction.
|
||
Restrictions
La prise en charge des données LOB est disponible uniquement lorsqu'elle est connectée à un serveur qui prend en charge les types de données d'objet LOB. Si l'application tente de spécifier un type de données C de releveur de coordonnées LOB pour un serveur qui ne le prend pas en charge, SQLSTATE HYC00 est renvoyé.
Exemple
/* bind column 1 to variable */
cliRC = SQLBindCol(hstmt, 1, SQL_C_SHORT, &deptnumb.val, 0, &deptnumb.ind);