Delen via


ODBC 64-bits informatie

Vanaf Windows Server 2003 hebben Microsoft-besturingssystemen de 64-bits ODBC-bibliotheken ondersteund. De ODBC-headers en -bibliotheken die voor het eerst worden geleverd met de MDAC 2.7 SDK bevatten wijzigingen zodat programmeurs eenvoudig code kunnen schrijven voor de nieuwe 64-bits platforms. Door ervoor te zorgen dat uw code gebruikmaakt van de hieronder vermelde ODBC-typen, kunt u dezelfde broncode compileren voor zowel 64-bits als 32-bits platforms op basis van de _WIN64 - of WIN32-macro's .

Er zijn verschillende punten om rekening mee te houden bij het programmeren voor een 64-bits processor:

  • Hoewel de grootte van een aanwijzer is gewijzigd van 4 bytes in 8 bytes, zijn gehele getallen en longen nog steeds 4 bytewaarden. De typen INT64 en UINT64 zijn gedefinieerd voor 8 byte gehele getallen. De nieuwe ODBC-typen SQLLEN en SQLULEN worden gedefinieerd in het ODBC-headerbestand als INT64 en UINT64 wanneer _WIN64 is gedefinieerd.

  • Verschillende functies in ODBC worden gedeclareerd met een pointer als parameter. In 32-bits ODBC werden parameters die zijn gedefinieerd als aanwijzers vaak gebruikt om een geheel getal of een aanwijzer door te geven aan een buffer, afhankelijk van de context van de aanroep. Dit was natuurlijk mogelijk vanwege het feit dat aanwijzers en gehele getallen dezelfde grootte hadden. In 64-bits Windows is dit niet het geval.

  • Sommige ODBC-functies die eerder zijn gedefinieerd met SQLINTEGER - en SQLUINTEGER-parameters , zijn zo nodig gewijzigd om de nieuwe SQLLEN - en SQLULEN-typedefs te gebruiken. Deze wijzigingen worden weergegeven in de volgende sectie, Functiedeclaratiewijzigingen.

  • Sommige van de descriptorvelden die kunnen worden ingesteld via de verschillende SQLSet - en SQLGet-functies zijn gewijzigd om plaats te bieden aan 64-bits waarden, terwijl andere nog steeds 32-bits waarden zijn. Zorg ervoor dat u de juiste groottevariabele gebruikt bij het instellen en ophalen van deze velden. Specifieke kenmerken waarvan descriptorvelden zijn gewijzigd, worden vermeld onder Wijzigingen in functiedeclaratie.

Wijzigingen in functiedeclaratie

De volgende functiehandtekeningen zijn gewijzigd voor 64-bits programmering. De items in vetgedrukte tekst zijn de specifieke parameters die verschillen.

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);  

Wijzigingen in SQL-gegevenstypen

De volgende vier SQL-typen worden nog steeds ondersteund op alleen 32 bits; ze zijn niet gedefinieerd voor 64-bits compilers. Deze typen worden niet meer gebruikt voor parameters in MDAC 2.7; het gebruik van deze typen veroorzaakt compilerfouten op 64-bits platforms.

#ifdef WIN32   
typedef SQLULEN SQLROWCOUNT;   
typedef SQLULEN SQLROWSETSIZE;   
typedef SQLULEN SQLTRANSID;   
typedef SQLLEN SQLROWOFFSET;   
#endif  

De definitie van SQLSETPOSIROW is gewijzigd voor zowel 32-bits als 64-bits compilers:

#ifdef _WIN64   
typedef UINT64 SQLSETPOSIROW;   
#else   
#define SQLSETPOSIROW SQLUSMALLINT   
#endif  

De definities van SQLLEN en SQLULEN zijn gewijzigd voor 64-bits compilers:

#ifdef _WIN64   
typedef INT64 SQLLEN;   
typedef UINT64 SQLULEN;   
#else   
#define SQLLEN SQLINTEGER   
#define SQLULEN SQLUINTEGER   
#endif  

Hoewel SQL_C_BOOKMARK is afgeschaft in ODBC 3.0, is deze waarde gewijzigd voor 64-bits compilers op 2.0-clients:

#ifdef _WIN64   
#define SQL_C_BOOKMARK SQL_C_UBIGINT   
#else   
#define SQL_C_BOOKMARK SQL_C_ULONG   
#endif  

Het type BOOKMARK is anders gedefinieerd in de nieuwere headers:

typedef SQLULEN BOOKMARK;  

Waarden geretourneerd door ODBC-API-aanroepen via aanwijzers

De volgende ODBC-functieaanroepen nemen als invoerparameter een aanwijzer naar een buffer waarin gegevens worden geretourneerd vanuit het stuurprogramma. De context en betekenis van de geretourneerde gegevens worden bepaald door andere invoerparameters voor de functies. In sommige gevallen kunnen deze methoden nu 64-bits waarden (8-byte integer) retourneren in plaats van de typische 32-bits (4-byte) gehele getallen. Deze gevallen zijn als volgt:

SQLColAttribute

Wanneer de parameter FieldIdentifier een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *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

Wanneer de parameter fDescType een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *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

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in Waarde:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGetConnectOption

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in Waarde:

SQL_ATTR_QUIET_MODE

SQLGetDescField

Wanneer de parameter FieldIdentifier een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *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

Wanneer de parameter DiagIdentifier een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *DiagInfoPtr:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

SQLGetInfo

Wanneer de parameter InfoType een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *InfoValuePtr:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

Wanneer InfoType een van de volgende twee waarden heeft, is *InfoValuePtr 64 bits op zowel invoer als uitvoer:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *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_NUMBER

SQL_ATTR_ROW_OPERATION_PTR

SQL_ATTR_ROW_STATUS_PTR

SQL_ATTR_SIMULATE_CURSOR

SQL_ATTR_USE_BOOKMARKS

SQLGetStmtOption

Wanneer de parameter Option een van de volgende waarden heeft, wordt een 64-bits waarde geretourneerd in *Value:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde doorgegeven in Waarde:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSetConnectOption

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde doorgegeven in Waarde:

SQL_ATTR_QUIET_MODE

SQLSetDescField

Wanneer de parameter FieldIdentifier een van de volgende waarden heeft, wordt een 64-bits waarde doorgegeven in 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

Wanneer de parameter Kenmerk een van de volgende waarden heeft, wordt een 64-bits waarde doorgegeven in 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_NUMBER

SQL_ATTR_ROW_OPERATION_PTR

SQL_ATTR_ROW_STATUS_PTR

SQL_ATTR_ROWS_FETCHED_PTR

SQL_ATTR_SIMULATE_CURSOR

SQL_ATTR_USE_BOOKMARKS

SQLSetStmtOption

Wanneer de parameter Option een van de volgende waarden heeft, wordt een 64-bits waarde doorgegeven in Waarde:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

Zie ook

Inleiding tot ODBC