Mappage des fonctions de remplacement pour la compatibilité descendante des applications

Une application ODBC 3.x fonctionnant via ODBC 3.x Driver Manager fonctionne sur un pilote ODBC 2.x tant qu’aucune nouvelle fonctionnalité n’est utilisée. Toutefois, les fonctionnalités dupliquées et les modifications comportementales affectent la façon dont l’application ODBC 3.x fonctionne sur un pilote ODBC 2.x . Lorsque vous utilisez un pilote ODBC 2.x , le Gestionnaire de pilotes mappe les fonctions ODBC 3.x suivantes, qui ont remplacé une ou plusieurs fonctions ODBC 2.x , dans les fonctions ODBC 2.x correspondantes.

Fonction ODBC 3.x Fonction ODBC 2.x
SQLAllocHandle SQLAllocEnv, SQLAlloc Connecter ou SQLAllocStmt
SQLBulkOperations SQLSetPos
SQLColAttribute SQLColAttributes
SQLEndTran SQLTransact
SQLFetch SQLExtendedFetch
SQLFetchScroll SQLExtendedFetch
SQLFreeHandle SQLFreeEnv, SQLFree Connecter ou SQLFreeStmt
SQLGetConnectAttr SQLGet Connecter Option
SQLGetDiagRec Sqlerror
SQLGetStmtAttr SQLGetStmtOption[1]
SQLSetConnectAttr SQLSet Connecter Option
SQLSetStmtAttr SQLSetStmtOption[1]

[1] D’autres actions peuvent également être effectuées, en fonction de l’attribut demandé.

SQLAllocHandle

Le Gestionnaire de pilotes mappe ceci à SQLAllocEnv, SQLAlloc Connecter ou SQLAllocStmt, le cas échéant. Appel suivant à SQLAllocHandle :

SQLAllocHandle(HandleType, InputHandle, OutputHandlePtr);  

entraîne l’exécution du mappage suivant (conceptuel, aucune erreur case activée ing) dans le Gestionnaire de pilotes :

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLAllocEnv(OutputHandlePtr));  
   case SQL_HANDLE_DBC: return (SQLAllocConnect (InputHandle, OutputHandlePtr));  
   case SQL_HANDLE_STMT: return (SQLAllocStmt (InputHandle, OutputHandlePtr));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLBulkOperations

Le Gestionnaire de pilotes mappe ceci à SQLSetPos. L’appel suivant à SQLBulkOperations :

SQLBulkOperations(hstmt, Operation);  

entraîne la séquence d’étapes suivante :

  1. Si l’argument Opération est SQL_ADD, le Gestionnaire de pilotes appelle SQLSetPos comme suit :

    SQLSetPos (hstmt, 0, SQL_ADD, SQL_LOCK_NO_CHANGE);  
    
  2. Si l’argument Opération n’est pas SQL_ADD, le pilote retourne SQLSTATE HY092 (identificateur d’attribut/d’option non valide).

  3. Si l’application tente de modifier la SQL_ATTR_ROW_STATUS_PTR entre les appels à SQLFetch ou SQLFetchScroll et SQLBulkOperations, le Gestionnaire de pilotes retourne SQLSTATE HY011 (l’attribut ne peut pas être défini maintenant).

  4. Si l’argument Opération est SQL_ADD, l’application doit appeler SQLBindCol pour lier les données à insérer. Il ne peut pas appeler SQLSetDescField ou SQLSetDescRec pour lier les données à insérer.

  5. Si l’argument Opération est SQL_ADD et que le nombre de lignes à insérer n’est pas identique à la taille actuelle de l’ensemble de lignes, SQLSetStmtAttr doit être appelé pour définir l’attribut d’instruction SQL_ATTR_ROW_ARRAY_SIZE sur le nombre de lignes à insérer avant d’appeler SQLBulkOperations. Pour revenir à la taille précédente de l’ensemble de lignes, l’application doit définir l’attribut d’instruction SQL_ATTR_ROW_ARRAY_SIZE avant SQLFetch, SQLFetchScroll ou SQLSetPos est appelé.

SQLColAttribute

Le Gestionnaire de pilotes mappe ceci à SQLColAttributes. L’appel suivant à SQLColAttribute :

SQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  

entraîne la séquence d’étapes suivante :

  1. Si FieldIdentifier est l’un des éléments suivants :

    SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, SQL_DESC_OCTET_LENGTH, SQL_DESC_UNNAMED, SQL_DESC_BASE_COLUMN_NAME, SQL_DESC_LITERAL_PREFIX, SQL_DESC_LITERAL_SUFFIX ou SQL_DESC_LOCAL_TYPE_NAME

    Le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY091 (identificateur de champ de descripteur non valide). Aucune autre règle de cette section ne s’applique.

  2. Le Gestionnaire de pilotes mappe SQL_COLUMN_COUNT, SQL_COLUMN_NAME ou SQL_COLUMN_NULLABLE à SQL_DESC_COUNT, SQL_DESC_NAME ou SQL_DESC_NULLABLE, respectivement. (Un ODBC Le pilote 2.x n’a besoin que de prendre en charge les SQL_COLUMN_COUNT, les SQL_COLUMN_NAME et les SQL_COLUMN_NULLABLE, pas SQL_DESC_COUNT, SQL_DESC_NAME et SQL_DESC_NULLABLE.) L’appel à SQLColAttribute est mappé à :

    SQLColAttributes(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttributePtr, BufferLength, StringLengthPtr, NumericAttributePtr);  
    
  3. Toutes les autres valeurs FieldIdentifier sont transmises au pilote, avec SQLColAttribute mappé à SQLColAttributes comme indiqué précédemment.

  4. Si BufferLength est inférieur à 0, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY090 (chaîne ou longueur de mémoire tampon non valide). Aucune autre règle de cette section ne s’applique.

  5. Si FieldIdentifier est SQL_DESC_CONCISE_TYPE et que le type retourné est un type de données datetime concis, le Gestionnaire de pilotes mappe les valeurs de retour pour les codes de date, d’heure et d’horodatage.

  6. Le Gestionnaire de pilotes effectue les case activée nécessaires pour déterminer si SQLSTATE HY010 (erreur de séquence de fonction) doit être déclenchée. Si c’est le cas, le Gestionnaire de pilotes retourne SQL_ERROR et SQLSTATE HY010 (erreur de séquence de fonction). Aucune autre règle de cette section ne s’applique.

SQLEndTran

Le Gestionnaire de pilotes mappe ceci à SQLTransact. L’appel suivant à SQLEndTran :

SQLEndTran(HandleType, Handle, CompletionType);  

entraîne l’exécution du mappage suivant (conceptuel, aucune erreur case activée ing) dans le Gestionnaire de pilotes :

switch (HandleType) {  
   case SQL_HANDLE_ENV:return(SQLTransact(Handle, SQL_NULL_HDBC, CompletionType));  
   case SQL_HANDLE_DBC:return(SQLTransact(SQL_NULL_HENV, Handle, CompletionType);  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLFetch

Le Gestionnaire de pilotes mappe ceci à SQLExtendedFetch avec un argument FetchOrientation de SQL_FETCH_NEXT. L’appel suivant à SQLFetch :

SQLFetch (StatementHandle);  

entraîne l’appel du Gestionnaire de pilotes SQLExtendedFetch, comme suit :

rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, &RowCount, RowStatusArray);  

Dans cet appel, l’argument pcRow est défini sur la valeur que l’application définit l’attribut d’instruction SQL_ATTR_ROWS_FETCHED_PTR par le biais d’un appel à SQLSetStmtAttr.

Remarque

Lorsque l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_ROW_STATUS_PTR pour pointer vers un tableau d’états, le Gestionnaire de pilotes met en cache le pointeur. RowStatusArray peut être égal à un pointeur Null.

Si le pilote ne prend pas en charge SQLExtendedFetch et que la bibliothèque de curseurs est chargée, le Gestionnaire de pilotes utilise le sqlExtendedFetch de la bibliothèque de curseurs pour mapper SQLFetch à SQLExtendedFetch. Si le pilote ne prend pas en charge SQLExtendedFetch et que la bibliothèque de curseurs n’est pas chargée, le Gestionnaire de pilotes transmet l’appel à SQLFetch au pilote. Si l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_ROW_STATUS_PTR, le Gestionnaire de pilotes garantit que le tableau est rempli. Si l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_ROWS_FETCHED_PTR, le Gestionnaire de pilotes définit ce champ sur 1.

SQLFetchScroll

Le Gestionnaire de pilotes mappe ceci à SQLExtendedFetch. L’appel suivant à SQLFetchScroll :

SQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset);  

entraîne la séquence d’étapes suivante :

  1. Lorsque l’application appelle SQLSetStmtAttr pour définir SQL_ATTR_ROW_STATUS_PTR (qui définit le champ SQL_DESC_ARRAY_STATUS_PTR dans l’IRD) pour pointer vers un tableau d’état, le Gestionnaire de pilotes met en cache ce pointeur. Laissez ce pointeur être RowStatusArray ; sinon, laissez RowStatusArray être égal à un pointeur Null. Si l’argument RowStatusArray est défini sur un pointeur Null, le Gestionnaire de pilotes génère un tableau d’état de ligne.

  2. Si FetchOrientation n’est pas l’un des SQL_FETCH_NEXT, SQL_FETCH_PRIOR, SQL_FETCH_ABSOLUTE, SQL_FETCH_RELATIVE, SQL_FETCH_FIRST, SQL_FETCH_LAST ou SQL_FETCH_BOOKMARK, le Gestionnaire de pilotes retourne avec SQL_ERROR et SQLSTATE HY106 (type d’extraction hors plage). Aucune autre règle de cette section ne s’applique.

  3. Casse :

  • Si FetchOrientation est égal à SQL_FETCH_BOOKMARK, puis :

    • Si SQLSetStmtAttr a été appelé précédemment pour définir la valeur de SQL_ATTR_FETCH_BOOKMARK_PTR, laissez Bmk être la valeur obtenue en déreferencant le pointeur SQL_DESC_FETCH_BOOKMARK_PTR.

    • Sinon, retournez SQL_ERROR avec SQLSTATE HY111 (valeur de signet non valide). Aucune autre règle de cette section ne s’applique.

    Le Gestionnaire de pilotes appelle maintenant SQLExtendedFetch, comme suit :

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, Bmk, pcRow, RowStatusArray);  
    
  • Sinon, le Gestionnaire de pilotes appelle SQLExtendedFetch, comme suit :

    rc = SQLExtendedFetch(StatementHandle, FetchOrientation, FetchOffset, pcRow, RowStatusArray);  
    

    Dans ces appels, l’argument pcRow est défini sur la valeur que l’application définit l’attribut d’instruction SQL_ATTR_ROWS_FETCHED_PTR par le biais d’un appel à SQLSetStmtAttr.

  • SQL_ATTR_ROW_ARRAY_SIZE est mappé à SQL_ROWSET_SIZE.

  • Si rc est égal à SQL_SUCCESS ou SQL_SUCCESS_WITH_INFO, et si FetchOrientation est égal à SQL_FETCH_BOOKMARK et FetchOffset n’est pas égal à 0, le Gestionnaire de pilotes publie un avertissement, SQLSTATE 01S10 (tentative d’extraction par décalage de signet, valeur de décalage ignorée) et retourne SQL_SUCCESS_WITH_INFO.

SQLFreeHandle

Le Gestionnaire de pilotes mappe ceci à SQLFreeEnv, SQLFree Connecter ou SQLFreeStmt selon les besoins. L’appel suivant à SQLFreeHandle :

SQLFreeHandle(HandleType, Handle);  

entraîne l’exécution du mappage suivant (conceptuel, aucune erreur case activée ing) dans le Gestionnaire de pilotes :

switch (HandleType) {  
   case SQL_HANDLE_ENV: return (SQLFreeEnv(Handle));  
   case SQL_HANDLE_DBC: return (SQLFreeConnect(Handle));  
   case SQL_HANDLE_STMT: return (SQLFreeStmt(Handle, SQL_DROP));  
   default: // return SQL_ERROR, SQLSTATE HY092 ("Invalid attribute/option identifier")  
}  

SQLGetConnectAttr

Le Gestionnaire de pilotes mappe ceci à SQLGet Connecter Option. L’appel suivant à SQLGet Connecter Attr :

SQLGetConnectAttr(ConnectionHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

entraîne la séquence d’étapes suivante :

  1. Si l’attribut n’est pas un attribut de connexion ou d’instruction défini par un pilote et qu’il n’est pas un attribut défini dans ODBC 2.x, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  2. Si l’attribut est égal à SQL_ATTR_AUTO_IPD ou SQL_ATTR_METADATA_ID, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/option non valide).

  3. Le Gestionnaire de pilotes effectue les case activée nécessaires pour voir si SQLSTATE 08003 (Connecter ion non ouverte) ou SQLSTATE HY010 (erreur de séquence de fonction) doit être déclenché. Si c’est le cas, le Gestionnaire de pilotes retourne SQL_ERROR et publie le message d’erreur approprié. Aucune autre règle de cette section ne s’applique.

  4. Le Gestionnaire de pilotes appelle SQLGet Connecter Option comme suit :

    SQLGetConnectOption (ConnectionHandle, Attribute, ValuePtr);  
    

    Notez que bufferLength et StringLengthPtr sont ignorés.

SQLGetData

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x appelle SQLGetData avec l’argument ColumnNumber égal à 0, le Gestionnaire de pilotes ODBC 3.x mappe ceci à un appel à SQLGetStmtOption avec l’attribut Option défini sur SQL_GET_BOOKMARK.

SQLGetStmtAttr

Le Gestionnaire de pilotes mappe ceci à SQLGetStmtOption. L’appel suivant à SQLGetStmtAttr :

SQLGetStmtAttr(StatementHandle, Attribute, ValuePtr, BufferLength, StringLengthPtr);  

entraîne la séquence d’étapes suivante :

  1. Si l’attribut n’est pas un attribut de connexion ou d’instruction défini par un pilote et qu’il n’est pas un attribut défini dans ODBC 2.x, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  2. Si l’attribut est l’un des éléments suivants :

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    Le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  3. Le Gestionnaire de pilotes effectue les case activée nécessaires pour déterminer si SQLSTATE HY010 (erreur de séquence de fonction) doit être déclenchée. Si c’est le cas, le Gestionnaire de pilotes retourne SQL_ERROR et SQLSTATE HY010 (erreur de séquence de fonction). Aucune autre règle de cette section ne s’applique.

  4. Si l’attribut est égal à SQL_ATTR_ROWS_FETCHED_PTR, le Gestionnaire de pilotes retourne un pointeur vers la variable du Gestionnaire de pilotes interne cRow, qu’il a utilisée ou utilise dans un appel à SQLExtendedFetch. Aucune autre règle de cette section ne s’applique.

  5. Si l’attribut est égal à SQL_DESC_FETCH_BOOKMARK_PTR, le Gestionnaire de pilotes retourne le pointeur approprié qu’il avait mis en cache pendant un appel à SQLSetStmtAttr.

  6. Si l’attribut est égal à SQL_ATTR_ROW_STATUS_PTR, le Gestionnaire de pilotes retourne le pointeur approprié qu’il avait mis en cache pendant un appel à SQLSetStmtAttr.

  7. Le Gestionnaire de pilotes appelle SQLGetStmtOption comme suit :

    SQLGetStmtOption (hstmt, fOption, pvParam);  
    

    hstmt, fOption et pvParam sont définis sur les valeurs de StatementHandle, Attribute et ValuePtr, respectivement. BufferLength et StringLengthPtr sont ignorés.

SQLSetConnectAttr

Le Gestionnaire de pilotes mappe ceci à SQLSet Connecter Option. L’appel suivant à SQLSet Connecter Attr :

SQLSetConnectAttr(ConnectionHandle, Attribute, ValuePtr, StringLength);  

entraîne la séquence d’étapes suivante :

  1. Si l’attribut n’est pas un attribut de connexion ou d’instruction défini par un pilote et qu’il n’est pas un attribut défini dans ODBC 2.x, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  2. Si l’attribut est égal à SQL_ATTR_AUTO_IPD, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (attribut/identificateur d’option non valide).

  3. Le Gestionnaire de pilotes effectue les case activée nécessaires pour déterminer si SQLSTATE 08003 (Connecter ion non ouverte) ou SQLSTATE HY010 (erreur de séquence de fonction) doivent être déclenchés. Si l’une de ces erreurs doit être déclenchée, le Gestionnaire de pilotes retourne SQL_ERROR et publie le message d’erreur approprié. Aucune autre règle de cette section ne s’applique.

  4. Le Gestionnaire de pilotes appelle SQLSet Connecter Option comme suit :

    SQLSetConnectOption (hdbc, fOption, vParam);  
    

    hdbc, fOption et vParam sont définis sur les valeurs de Connecter ionHandle, Attribute et ValuePtr, respectivement. StringLengthPtr est ignoré.

Remarque

La possibilité de définir des attributs d’instruction au niveau de la connexion a été déconseillée. Les attributs d’instruction ne doivent jamais être définis au niveau de la connexion par une application ODBC 3.x .

SQLSetStmtAttr

Le Gestionnaire de pilotes mappe ceci à SQLSetStmtOption. Appel suivant à SQLSetStmtAttr :

SQLSetStmtAttr(StatementHandle, Attribute, ValuePtr, StringLength);  

entraîne la séquence d’étapes suivante :

  1. Si l’attribut n’est pas un attribut de connexion ou d’instruction défini par un pilote et qu’il n’est pas un attribut défini dans ODBC 2.x, le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  2. Si l’attribut est l’un des éléments suivants :

    SQL_ATTR_APP_ROW_DESC

    SQL_ATTR_APP_PARAM_DESC

    SQL_ATTR_AUTO_IPD

    SQL_ATTR_ROW_BIND_TYPE

    SQL_ATTR_IMP_ROW_DESC

    SQL_ATTR_IMP_PARAM_DESC

    SQL_ATTR_METADATA_ID

    SQL_ATTR_PARAM_BIND_TYPE

    SQL_ATTR_PREDICATE_PTR

    SQL_ATTR_PREDICATE_OCTET_LENGTH_PTR

    SQL_ATTR_PARAM_BIND_OFFSET_PTR

    SQL_ATTR_ROW_BIND_OFFSET_PTR

    SQL_ATTR_ROW_OPERATION_PTR

    SQL_ATTR_PARAM_OPERATION_PTR

    Le Gestionnaire de pilotes retourne SQL_ERROR avec SQLSTATE HY092 (identificateur d’attribut/d’option non valide). Aucune autre règle de cette section ne s’applique.

  3. Le Gestionnaire de pilotes effectue les case activée nécessaires pour déterminer si SQLSTATE HY010 (erreur de séquence de fonction) doit être déclenchée. Si c’est le cas, le Gestionnaire de pilotes retourne SQL_ERROR et SQLSTATE HY010 (erreur de séquence de fonction). Aucune autre règle de cette section ne s’applique.

  4. Si l’attribut est égal à SQL_ATTR_PARAMSET_SIZE ou SQL_ATTR_PARAMS_PROCESSED_PTR, consultez la section « Mappages pour la gestion des tableaux de paramètres », plus loin dans cette rubrique. Aucune autre règle de cette section ne s’applique.

  5. Si l’attribut est égal à SQL_ATTR_ROWS_FETCHED_PTR, le Gestionnaire de pilotes met en cache la valeur du pointeur pour une utilisation ultérieure avec SQLFetchScroll.

  6. Si l’attribut est égal à SQL_ATTR_ROW_STATUS_PTR, le Gestionnaire de pilotes met en cache la valeur du pointeur pour une utilisation ultérieure avec SQLFetchScroll ou SQLSetPos. Aucune autre règle de cette section ne s’applique.

  7. Si l’attribut est égal à SQL_ATTR_FETCH_BOOKMARK_PTR, le Gestionnaire de pilotes met en cache ValuePtr et utilise la valeur mise en cache ultérieurement dans un appel à SQLFetchScroll. Aucune autre règle de cette section ne s’applique.

  8. Le Gestionnaire de pilotes appelle SQLSetStmtOption comme suit :

    SQLSetStmtOption (hstmt, fOption, vParam);  
    

    hstmt, fOption et vParam sont définis sur les valeurs de StatementHandle, Attribute et ValuePtr, respectivement. L’argument StringLength est ignoré.

    Si un pilote ODBC 2.x prend en charge les options d’instruction spécifiques aux chaînes de caractères, une application ODBC 3.x doit appeler SQLSetStmtOption pour définir ces options.

Mappages pour la gestion des tableaux de paramètres

Quand l’application appelle :

SQLSetStmtAttr (StatementHandle, SQL_ATTR_PARAMSET_SIZE, Size, StringLength);  

appels du Gestionnaire de pilotes :

SQLParamOptions (StatementHandle, Size, &RowCount);  

Le Gestionnaire de pilotes retourne ultérieurement un pointeur vers cette variable lorsque l’application appelle SQLGetStmtAttr pour récupérer SQL_ATTR_PARAMS_PROCESSED_PTR. Le Gestionnaire de pilotes ne peut pas modifier cette variable interne tant que le handle d’instruction n’est pas retourné à l’état préparé ou alloué.

Une application ODBC 3.x peut appeler SQLGetStmtAttr pour obtenir la valeur de SQL_ATTR_PARAMS_PROCESSED_PTR même si elle n’a pas explicitement défini le champ SQL_DESC_ARRAY_SIZE dans l’APD. Cette situation peut se produire, par exemple, si l’application a une routine générique qui case activée pour la « ligne » actuelle des paramètres en cours de traitement lorsque SQLExecute retourne SQL_NEED_DATA. Cette routine est appelée si la SQL_DESC_ARRAY_SIZE est supérieure ou non à 1. Pour ce faire, le Gestionnaire de pilotes doit définir cette variable interne si l’application a appelé SQLSetStmtAttr pour définir le champ SQL_DESC_ARRAY_SIZE dans APD. Si SQL_DESC_ARRAY_SIZE n’a pas été défini, le Gestionnaire de pilotes doit s’assurer que cette variable contient la valeur 1 avant de retourner à partir de SQLExecDirect ou DE SQLExecute.

Gestion des erreurs

Dans ODBC 3.x, l’appel de SQLFetch ou SQLFetchScroll remplit les SQL_DESC_ARRAY_STATUS_PTR dans l’IRD, et le champ SQL_DIAG_ROW_NUMo ER d’un enregistrement de diagnostic donné contient le nombre de lignes de l’ensemble de lignes auquel cet enregistrement se rapporte. À l’aide de cela, l’application peut mettre en corrélation un message d’erreur avec une position de ligne donnée.

Un pilote ODBC 2.x ne peut pas fournir cette fonctionnalité. Toutefois, elle fournit une démarcation d’erreur avec SQLSTATE 01S01 (erreur dans la ligne). Une application ODBC 3.x qui utilise SQLFetch ou SQLFetchScroll tout en accédant à un pilote ODBC 2.x doit être consciente de ce fait. Notez également qu’une telle application ne pourra pas appeler SQLGetDiagField pour obtenir le champ SQL_DIAG_ROW_NUMo ER de toute façon. Une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x peut appeler SQLGetDiagField uniquement avec un argument DiagIdentifier de SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_RETURNCODE ou SQL_DIAG_SQLSTATE. Le Gestionnaire de pilotes ODBC 3.x gère la structure des données de diagnostic lors de l’utilisation d’un pilote ODBC 2.x , mais le pilote ODBC 2.x retourne uniquement ces quatre champs.

Lorsqu’une application ODBC 2.x fonctionne avec un pilote ODBC 2.x , si une opération peut provoquer plusieurs erreurs renvoyées par le Gestionnaire de pilotes, différentes erreurs peuvent être retournées par le Gestionnaire de pilotes ODBC 3.x que par le Gestionnaire de pilotes ODBC 2.x .

Mappages pour les opérations de signet

Odbc 3.x Driver Manager effectue les mappages suivants lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x effectue des opérations de signet.

SQLBindCol

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x appelle SQLBindCol pour établir une liaison à la colonne 0 avec fCType égal à SQL_C_VARBOOKMARK, le Gestionnaire de pilotes ODBC 3.x case activée s pour voir si l’argument BufferLength est inférieur à 4 ou supérieur à 4, et si c’est le cas, retourne SQLSTATE HY090 (chaîne ou longueur de mémoire tampon non valide). Si l’argument BufferLength est égal à 4, le Gestionnaire de pilotes appelle SQLBindCol dans le pilote, après avoir remplacé fCType par SQL_C_BOOKMARK.

SQLColAttribute

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x appelle SQLColAttribute avec l’argument ColumnNumber défini sur 0, le Gestionnaire de pilotes retourne les valeurs FieldIdentifier répertoriées dans le tableau suivant.

FieldIdentifier Valeur
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE
SQL_DESC_CATALOG_NAME "" (chaîne vide)
SQL_DESC_CONCISE_TYPE SQL_BINARY
SQL_DESC_COUNT La même valeur retournée par SQLNumResultCols
SQL_DESC_DATETIME_INTERVAL_CODE 0
SQL_DESC_DISPLAY_SIZE 8
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE
SQL_DESC_LABEL "" (chaîne vide)
SQL_DESC_LENGTH 0
SQL_DESC_LITERAL_PREFIX "" (chaîne vide)
SQL_DESC_LITERAL_SUFFIX "" (chaîne vide)
SQL_DESC_LOCAL_TYPE_NAME "" (chaîne vide)
SQL_DESC_NAME "" (chaîne vide)
SQL_DESC_NULLABLE SQL_NO_NULLS
SQL_DESC_OCTET_LENGTH 4
SQL_DESC_PRECISION 4
SQL_DESC_SCALE 0
SQL_DESC_SCHEMA_NAME "" (chaîne vide)
SQL_DESC_SEARCHABLE SQL_PRED_NONE
SQL_DESC_TABLE_NAME "" (chaîne vide)
SQL_DESC_TYPE SQL_BINARY
SQL_DESC_TYPE_NAME "" (chaîne vide)
SQL_DESC_UNNAMED SQL_UNNAMED
SQL_DESC_UNSIGNED SQL_FALSE
SQL_DESC_UPDATEABLE SQL_ATTR_READ_ONLY

SQLDescribeCol

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x appelle SQLDescribeCol avec l’argument ColumnNumber défini sur 0, le Gestionnaire de pilotes retourne les valeurs répertoriées dans le tableau suivant.

Buffer Valeur
ColumnName "" (chaîne vide)
*NameLengthPtr 0
*DataTypePtr SQL_BINARY
*ColumnSizePtr 4
*DecimalDigitsPtr 0
*NullablePtr SQL_NO_NULLS

SQLGetData

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x effectue l’appel suivant à SQLGetData pour récupérer un signet :

SQLGetData(StatementHandle, 0, SQL_C_VARBOOKMARK, TargetValuePtr, BufferLength, StrLen_or_IndPtr)  

l’appel est mappé à SQLGetStmtOption avec une option fOption de SQL_GET_BOOKMARK, comme suit :

SQLGetStmtOption(hstmt, SQL_GET_BOOKMARK, TargetValuePtr)  

hstmt et pvParam sont définis sur les valeurs dans StatementHandle et TargetValuePtr, respectivement. Le signet est retourné dans la mémoire tampon pointée par l’argument pvParam (TargetValuePtr). La valeur de la mémoire tampon pointée par l’argument StrLen_or_IndPtr dans l’appel à SQLGetData est définie sur 4.

Ce mappage est nécessaire pour tenir compte du cas dans lequel SQLFetch a été appelé avant l’appel à SQLGetData et le pilote ODBC 2.x n’a pas pris en charge SQLExtendedFetch. Dans ce cas, SQLFetch est transmis au pilote ODBC 2.x , auquel cas la récupération des signets n’est pas prise en charge.

SQLGetData ne peut pas être appelé plusieurs fois dans un pilote ODBC 2.x pour récupérer un signet dans des parties. Par conséquent, l’appel de SQLGetData avec l’argument BufferLength défini sur une valeur inférieure à 4 et l’argument ColumnNumber défini sur 0 retourne SQLSTATE HY090 (chaîne ou longueur de mémoire tampon non valide). SQLGetData peut toutefois être appelé plusieurs fois pour récupérer le même signet.

SQLSetStmtAttr

Lorsqu’une application ODBC 3.x fonctionnant avec un pilote ODBC 2.x appelle SQLSetStmtAttr pour définir l’attribut SQL_ATTR_USE_BOOKMARKS sur SQL_UB_VARIABLE, le Gestionnaire de pilotes définit l’attribut sur SQL_UB_ON dans le pilote ODBC 2.x sous-jacent.