64-Bit-ODBC-Informationen

Ab Windows Server 2003 unterstützt Microsoft-Betriebssysteme die 64-Bit-ODBC-Bibliotheken. Die ODBC-Header und -Bibliotheken, die zuerst mit dem MDAC 2.7 SDK ausgeliefert wurden, enthalten Änderungen, um Programmierern das einfache Schreiben von Code für die neuen 64-Bit-Plattformen zu ermöglichen. Indem Sie sicherstellen, dass Ihr Code die unten aufgeführten ODBC-definierten Typen verwendet, können Sie denselben Quellcode sowohl für 64-Bit- als auch für 32-Bit-Plattformen basierend auf den _WIN64- oder WIN32-Makros kompilieren.

Bei der Programmierung für einen 64-Bit-Prozessor gibt es mehrere Punkte, die Sie berücksichtigen sollten:

  • Obwohl sich die Größe eines Zeigers von 4 Byte auf 8 Bytes geändert hat, sind ganze Zahlen und Lange immer noch 4 Bytewerte. Die Typen INT64 und UINT64 wurden für 8 Byte-Ganzzahlen definiert. Die neuen ODBC-Typen SQLLEN und SQLULEN werden in der ODBC-Headerdatei als INT64 und UINT64 definiert, wenn _WIN64 definiert wurde.

  • Mehrere Funktionen in ODBC werden als Zeigerparameter deklariert. In 32-Bit-ODBC wurden Parameter, die als Zeiger definiert wurden, häufig verwendet, um abhängig vom Kontext des Aufrufs entweder einen ganzzahligen Wert oder einen Zeiger an einen Puffer zu übergeben. Dies war natürlich möglich, weil Zeiger und ganze Zahlen dieselbe Größe hatten. In 64-Bit-Windows ist dies nicht der Fall.

  • Einige ODBC-Funktionen, die zuvor mit SQLINTEGER - und SQLUINTEGER-Parametern definiert wurden, wurden ggf. geändert, um die neuen SQLLEN - und SQLULEN-Typedefs zu verwenden. Diese Änderungen werden im nächsten Abschnitt aufgeführt, Funktionsdeklarationsänderungen.

  • Einige der Beschreibungsfelder, die über die verschiedenen SQLSet - und SQLGet-Funktionen festgelegt werden können, wurden geändert, um 64-Bit-Werte aufzunehmen, während andere noch 32-Bit-Werte sind. Stellen Sie sicher, dass Sie beim Festlegen und Abrufen dieser Felder die entsprechende Größenvariable verwenden. Einzelheiten, deren Beschreibungsfelder geändert wurden, werden unter Funktionsdeklarationsänderungen aufgeführt.

Funktionsdeklarationsänderungen

Die folgenden Funktionssignaturen wurden für die 64-Bit-Programmierung geändert. Die Elemente in fett formatiertem Text sind die spezifischen Parameter, die unterschiedlich sind.

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

Änderungen in SQL-Datentypen

Die folgenden vier SQL-Typen werden weiterhin nur auf 32-Bit-Versionen unterstützt. sie sind nicht für 64-Bit-Compiler definiert. Diese Typen werden nicht mehr für Parameter in MDAC 2.7 verwendet; Die Verwendung dieser Typen führt zu Compilerfehlern auf 64-Bit-Plattformen.

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

Die Definition von SQLSETPOSIROW wurde sowohl für 32-Bit- als auch für 64-Bit-Compiler geändert:

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

Die Definitionen von SQLLEN und SQLULEN haben sich für 64-Bit-Compiler geändert:

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

Obwohl SQL_C_BOOKMARK in ODBC 3.0 veraltet ist, hat sich dieser Wert für 64-Bit-Compiler auf 2.0-Clients geändert:

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

Der BOOKMARK-Typ wird in den neueren Kopfzeilen anders definiert:

typedef SQLULEN BOOKMARK;  

Von ODBC-API-Aufrufen zurückgegebene Werte über Zeiger

Die folgenden ODBC-Funktionsaufrufe verwenden als Eingabeparameter einen Zeiger auf einen Puffer, in dem Daten vom Treiber zurückgegeben werden. Der Kontext und die Bedeutung der zurückgegebenen Daten werden durch andere Eingabeparameter für die Funktionen bestimmt. In einigen Fällen geben diese Methoden jetzt 64-Bit-Werte (8-Byte-Ganzzahl) anstelle der typischen 32-Bit-Ganzzahlwerte (4 Byte) zurück. Diese Fälle sind wie folgt:

SQLColAttribute

Wenn der Parameter FieldIdentifier einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in *NumericAttribute zurückgegeben:

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

Wenn der fDescType-Parameter einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in *pfDesc zurückgegeben:

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

Wenn der Parameter "Attribute " einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in "Value" zurückgegeben:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGet Verbinden Option

Wenn der Parameter "Attribute " einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in "Value" zurückgegeben:

SQL_ATTR_QUIET_MODE

SQLGetDescField

Wenn der Parameter FieldIdentifier einen der folgenden Werte aufweist, wird in *ValuePtr ein 64-Bit-Wert zurückgegeben:

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

Wenn der DiagIdentifier-Parameter einen der folgenden Werte aufweist, wird in *DiagInfoPtr ein 64-Bit-Wert zurückgegeben:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

SQLGetInfo

Wenn der InfoType-Parameter einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in *InfoValuePtr zurückgegeben:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

Wenn InfoType über einen der folgenden 2 Werte verfügt *InfoValuePtr ist 64-Bits für Eingabe und Ausgabe:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

Wenn der Parameter "Attribute" einen der folgenden Werte aufweist, wird in *ValuePtr ein 64-Bit-Wert zurückgegeben:

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

Wenn der Parameter Option einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in *Value zurückgegeben:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

Wenn der Parameter "Attribute " einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in "Value" übergeben:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSet Verbinden Option

Wenn der Parameter "Attribute " einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in "Value" übergeben:

SQL_ATTR_QUIET_MODE

SQLSetDescField

Wenn der FieldIdentifier-Parameter einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in ValuePtr übergeben:

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

Wenn der Parameter "Attribute " einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in ValuePtr übergeben:

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

Wenn der Parameter Option einen der folgenden Werte aufweist, wird ein 64-Bit-Wert in "Value" übergeben:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

Weitere Informationen

Einführung in ODBC