Informations sur ODBC 64 bits
À compter de Windows Server 2003, les systèmes d’exploitation Microsoft ont pris en charge les bibliothèques ODBC 64 bits. Les en-têtes et bibliothèques ODBC d’abord fournis avec le SDK MDAC 2.7 contiennent des modifications pour permettre aux programmeurs d’écrire facilement du code pour les nouvelles plateformes 64 bits. En vous assurant que votre code utilise les types définis par ODBC répertoriés ci-dessous, vous pouvez compiler le même code source pour les plateformes 64 bits et 32 bits basées sur les macros _WIN64 ou WIN32 .
Il existe plusieurs points à garder à l’esprit lors de la programmation d’un processeur 64 bits :
Bien que la taille d’un pointeur soit passée de 4 octets à 8 octets, les entiers et les longueurs sont toujours de 4 octets. Les types INT64 et UINT64 ont été définis pour 8 octets entiers. Les nouveaux types ODBC SQLLEN et SQLULEN sont définis dans le fichier d’en-tête ODBC en tant qu’INT64et UINT64 lorsque _WIN64 a été défini.
Plusieurs fonctions dans ODBC sont déclarées comme prenant un paramètre de pointeur. Dans ODBC 32 bits, les paramètres définis comme pointeurs étaient fréquemment utilisés pour passer une valeur entière ou un pointeur vers une mémoire tampon en fonction du contexte de l’appel. Bien sûr, cela était possible en raison du fait que les pointeurs et les entiers avaient la même taille. Dans Windows 64 bits, ce n’est pas le cas.
Certaines fonctions ODBC qui ont été précédemment définies avec les paramètres SQLINTEGER et SQLUINTEGER ont été modifiées si nécessaire pour utiliser les nouveaux types SQLLEN et SQLULEN . Ces modifications sont répertoriées dans la section suivante, modifications de déclaration de fonction.
Certains des champs de descripteur qui peuvent être définis via les différentes fonctions SQLSet et SQLGet ont été modifiés pour prendre en charge les valeurs 64 bits, tandis que d’autres sont toujours des valeurs 32 bits. Veillez à utiliser la variable de taille appropriée lors de la définition et de la récupération de ces champs. Les spécificités dont les champs de descripteur ont été modifiés sont répertoriées sous Modifications de déclaration de fonction.
Modifications de déclaration de fonction
Les signatures de fonction suivantes ont changé pour la programmation 64 bits. Les éléments en gras sont les paramètres spécifiques qui sont différents.
SQLBindCol (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN * StrLen_or_Ind);
SQLBindParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT ValueType, SQLSMALLINT ParameterType,
SQLULEN ColumnSize, SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr, SQLLEN *StrLen_or_Ind);
SQLBindParameter (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType, SQLSMALLINT ValueType,
SQLSMALLINT ParameterType, SQLULEN ColumnSize, SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_IndPtr);
SQLColAttribute (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength, SQLSMALLINT * StringLengthPtr,
SQLLEN* NumericAttributePtr)
SQLColAttributes (SQLHSTMT hstmt, SQLUSMALLINT icol,
SQLUSMALLINT fDescType, SQLPOINTER rgbDesc,
SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN * pfDesc);
SQLDescribeCol (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLCHAR *ColumnName, SQLSMALLINT BufferLength,
SQLSMALLINT *NameLengthPtr, SQLSMALLINT *DataTypePtr, SQLULEN *ColumnSizePtr,
SQLSMALLINT *DecimalDigitsPtr, SQLSMALLINT *NullablePtr);
SQLDescribeParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT *DataTypePtr, SQLULEN *ParameterSizePtr, SQLSMALLINT *DecimalDigitsPtr,
SQLSMALLINT *NullablePtr);
SQLExtendedFetch(SQLHSTMT StatementHandle, SQLUSMALLINT FetchOrientation, SQLLEN FetchOffset,
SQLULEN * RowCountPtr, SQLUSMALLINT * RowStatusArray);
SQLFetchScroll (SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
SQLGetData (SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind);
SQLGetDescRec (SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
SQLCHAR *Name, SQLSMALLINT BufferLength,
SQLSMALLINT *StringLengthPtr, SQLSMALLINT *TypePtr,
SQLSMALLINT *SubTypePtr, SQLLEN *LengthPtr,
SQLSMALLINT *PrecisionPtr, SQLSMALLINT *ScalePtr,
SQLSMALLINT *NullablePtr);
SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN * pirow);
SQLPutData (SQLHSTMT StatementHandle, SQLPOINTER DataPtr,
SQLLEN StrLen_or_Ind);
SQLRowCount (SQLHSTMT StatementHandle, SQLLEN* RowCountPtr);
SQLSetConnectOption(SQLHDBC ConnectHandle, SQLUSMALLINT Option,
SQLULEN Value);
SQLSetPos (SQLHSTMT StatementHandle, SQLSETPOSIROW RowNumber, SQLUSMALLINT Operation,
SQLUSMALLINT LockType);
SQLSetParam (SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber,
SQLSMALLINT ValueType, SQLSMALLINT ParameterType,
SQLULEN LengthPrecision, SQLSMALLINT ParameterScale,
SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind);
SQLSetDescRec (SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber,
SQLSMALLINT Type, SQLSMALLINT SubType, SQLLEN Length,
SQLSMALLINT Precision, SQLSMALLINT Scale, SQLPOINTER DataPtr,
SQLLEN *StringLengthPtr, SQLLEN *IndicatorPtr);
SQLSetScrollOptions (SQLHSTMT hstmt, SQLUSMALLINT fConcurrency,
SQLLEN crowKeyset, SQLUSMALLINT crowRowset);
SQLSetStmtOption (SQLHSTMT StatementHandle, SQLUSMALLINT Option,
SQLULEN Value);
Modifications apportées aux types de données SQL
Les quatre types SQL suivants sont toujours pris en charge sur 32 bits uniquement ; ils ne sont pas définis pour les compilateurs 64 bits. Ces types ne sont plus utilisés pour les paramètres de MDAC 2.7 ; l’utilisation de ces types entraîne des défaillances du compilateur sur les plateformes 64 bits.
#ifdef WIN32
typedef SQLULEN SQLROWCOUNT;
typedef SQLULEN SQLROWSETSIZE;
typedef SQLULEN SQLTRANSID;
typedef SQLLEN SQLROWOFFSET;
#endif
La définition de SQLSETPOSIROW a changé pour les compilateurs 32 bits et 64 bits :
#ifdef _WIN64
typedef UINT64 SQLSETPOSIROW;
#else
#define SQLSETPOSIROW SQLUSMALLINT
#endif
Les définitions de SQLLEN et SQLULEN ont changé pour les compilateurs 64 bits :
#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif
Bien que SQL_C_BOOKMARK soit déconseillé dans ODBC 3.0, pour les compilateurs 64 bits sur les clients 2.0, cette valeur a changé :
#ifdef _WIN64
#define SQL_C_BOOKMARK SQL_C_UBIGINT
#else
#define SQL_C_BOOKMARK SQL_C_ULONG
#endif
Le type BOOKMARK est défini différemment dans les en-têtes les plus récents :
typedef SQLULEN BOOKMARK;
Valeurs retournées par les appels d’API ODBC via des pointeurs
Les appels de fonction ODBC suivants prennent comme paramètre d’entrée un pointeur vers une mémoire tampon dans laquelle les données sont retournées par le pilote. Le contexte et la signification des données retournées sont déterminés par d’autres paramètres d’entrée pour les fonctions. Dans certains cas, ces méthodes peuvent désormais retourner des valeurs entières 64 bits (entiers de 8 octets) au lieu des valeurs entières 32 bits (4 octets) classiques. Ces cas sont les suivants :
SQLColAttribute
Lorsque le paramètre FieldIdentifier a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *NumericAttribute :
SQL_DESC_AUTO_UNIQUE_VALUE
SQL_DESC_CASE_SENSITIVE
SQL_DESC_CONCISE_TYPE
SQL_DESC_COUNT
SQL_DESC_DISPLAY_SIZE
SQL_DESC_FIXED_PREC_SCALE
SQL_DESC_LENGTH
SQL_DESC_NULLABLE
SQL_DESC_NUM_PREC_RADIX
SQL_DESC_OCTET_LENGTH
SQL_DESC_PRECISION
SQL_DESC_SCALE
SQL_DESC_SEARCHABLE
SQL_DESC_TYPE
SQL_DESC_UNNAMED
SQL_DESC_UNSIGNED
SQL_DESC_UPDATABLE
SQLColAttributes
Lorsque le paramètre fDescType a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *pfDesc :
SQL_COLUMN_COUNT
SQL_COLUMN_DISPLAY_SIZE
SQL_COLUMN_LENGTH
SQL_DESC_AUTO_UNIQUE_VALUE
SQL_DESC_CASE_SENSITIVE
SQL_DESC_CONCISE_TYPE
SQL_DESC_FIXED_PREC_SCALE
SQL_DESC_SEARCHABLE
SQL_DESC_UNSIGNED
SQL_DESC_UPDATABLE
SQLGetConnectAttr
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est retournée dans Value :
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLGet Connecter Option
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est retournée dans Value :
SQL_ATTR_QUIET_MODE
SQLGetDescField
Lorsque le paramètre FieldIdentifier a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *ValuePtr :
SQL_DESC_ARRAY_SIZE
SQL_DESC_ARRAY_STATUS_PTR
SQL_DESC_BIND_OFFSET_PTR
SQL_DESC_DATA_PTR
SQL_DESC_DISPLAY_SIZE
SQL_DESC_INDICATOR_PTR
SQL_DESC_LENGTH
SQL_DESC_OCTET_LENGTH
SQL_DESC_OCTET_LENGTH_PTR
SQL_DESC_ROWS_PROCESSED_PTR
SQLGetDiagField
Lorsque le paramètre DiagIdentifier a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *DiagInfoPtr :
SQL_DIAG_CURSOR_ROW_COUNT
SQL_DIAG_ROW_COUNT
SQL_DIAG_ROW_NUMo ER
SQLGetInfo
Lorsque le paramètre InfoType a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *InfoValuePtr :
SQL_DRIVER_HDBC
SQL_DRIVER_HENV
SQL_DRIVER_HLIB
Lorsque InfoType a l’une des 2 valeurs suivantes *InfoValuePtr est de 64 bits à la fois sur l’entrée et la sortie :
SQL_DRIVER_HDESC
SQL_DRIVER_HSTMT
SQLGetStmtAttr
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *ValuePtr :
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_CONCURRENCY
SQL_ATTR_CURSOR_SCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY
SQL_ATTR_CURSOR_TYPE
SQL_ATTR_ENABLE_AUTO_IPD
SQL_ATTR_FETCH_BOOKMARK_PTR
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_KEYSET_SIZE
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_METADATA_ID
SQL_ATTR_NOSCAN
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PARAM_OPERATION_PTR
SQL_ATTR_PARAM_STATUS_PTR
SQL_ATTR_PARAMS_PROCESSED_PTR
SQL_ATTR_PARAMSET_SIZE
SQL_ATTR_QUERY_TIMEOUT
SQL_ATTR_RETRIEVE_DATA
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMo ER
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_ROW_STATUS_PTR
SQL_ATTR_SIMULATE_CURSOR
SQL_ATTR_USE_BOOKMARKS
SQLGetStmtOption
Lorsque le paramètre Option a l’une des valeurs suivantes, une valeur 64 bits est retournée dans *Value :
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE
SQLSetConnectAttr
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est passée dans Value :
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLSet Connecter Option
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est passée dans Value :
SQL_ATTR_QUIET_MODE
SQLSetDescField
Lorsque le paramètre FieldIdentifier a l’une des valeurs suivantes, une valeur 64 bits est passée dans ValuePtr :
SQL_DESC_ARRAY_SIZE
SQL_DESC_ARRAY_STATUS_PTR
SQL_DESC_BIND_OFFSET_PTR
SQL_DESC_DATA_PTR
SQL_DESC_DISPLAY_SIZE
SQL_DESC_INDICATOR_PTR
SQL_DESC_LENGTH
SQL_DESC_OCTET_LENGTH
SQL_DESC_OCTET_LENGTH_PTR
SQL_DESC_ROWS_PROCESSED_PTR
SQLSetStmtAttr
Lorsque le paramètre Attribute a l’une des valeurs suivantes, une valeur 64 bits est passée dans ValuePtr :
SQL_ATTR_APP_PARAM_DESC
SQL_ATTR_APP_ROW_DESC
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_CONCURRENCY
SQL_ATTR_CURSOR_SCROLLABLE
SQL_ATTR_CURSOR_SENSITIVITY
SQL_ATTR_CURSOR_TYPE
SQL_ATTR_ENABLE_AUTO_IPD
SQL_ATTR_FETCH_BOOKMARK_PTR
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_KEYSET_SIZE
SQL_ATTR_MAX_LENGTH
SQL_ATTR_MAX_ROWS
SQL_ATTR_METADATA_ID
SQL_ATTR_NOSCAN
SQL_ATTR_PARAM_BIND_OFFSET_PTR
SQL_ATTR_PARAM_BIND_TYPE
SQL_ATTR_PARAM_OPERATION_PTR
SQL_ATTR_PARAM_STATUS_PTR
SQL_ATTR_PARAMS_PROCESSED_PTR
SQL_ATTR_PARAMSET_SIZE
SQL_ATTR_QUERY_TIMEOUT
SQL_ATTR_RETRIEVE_DATA
SQL_ATTR_ROW_ARRAY_SIZE
SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_ATTR_ROW_NUMo ER
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_ROW_STATUS_PTR
SQL_ATTR_ROWS_FETCHED_PTR
SQL_ATTR_SIMULATE_CURSOR
SQL_ATTR_USE_BOOKMARKS
SQLSetStmtOption
Lorsque le paramètre Option a l’une des valeurs suivantes, une valeur 64 bits est passée dans Value :
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE