ODBC 64 位信息

从 Windows Server 2003 开始,Microsoft 操作系统支持 64 位 ODBC 库。 首次随 MDAC 2.7 SDK 一起提供的 ODBC 标头和库包含更改,便于程序员轻松为新的 64 位平台编写代码。 通过确保代码使用下列 ODBC 定义类型,以根据_WIN64 或 WIN32 宏为 64 位和 32 位平台编译相同的源代码。

为 64 位处理器编程时,请记住以下几点:

  • 尽管指针大小已从 4 字节更改为 8 字节,但整数和长整数仍然为 4 字节值。 已为 8 字节整数定义类型 INT64 和 UINT64。 定义 _WIN64 时,新的 ODBC 类型 SQLLEN 和 SQLULEN 在 ODBC 头文件中定义为 INT64 和 UINT64。

  • ODBC 中的多个函数声明为采用指针参数。 在 32 位 ODBC 中,定义为指针的参数通常用于根据调用上下文传递整数值或指向缓冲区的指针。 当然,这可能是因为指针和整数的大小相同。 而在 64 位 Windows 中,情况并非如此。

  • 之前使用 SQLINTEGER 和 SQLUINTEGER 参数定义的部分 ODBC 函数已根据需要进行更改,以便使用新的 SQLLEN 和 SQLULEN typedefs。 这些更改将在下一节“函数声明更改”中列出。

  • 可通过各种 SQLSet 和 SQLGet 函数设置的某些描述符字段已进行更改以适应 64 位值,而其他字段仍然是 32 位值。 确保在设置和检索这些字段时使用适当大小的变量。 函数声明更改下列出了已更改的描述符字段的具体内容。

函数声明更改

对于 64 位编程,以下函数签名已更改。 以粗体文本显示的项为不同的特定参数。

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

SQL 数据类型中的更改

以下四种 SQL 类型仍然仅在 32 位编译器上受支持;不适用于 64 位编译器。 这些类型不再用于 MDAC 2.7 中的任何参数;使用这些类型将导致 64 位平台上的编译器失败。

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

SQLSETPOSIROW 的定义已针对 32 位和 64 位编译器进行更改:

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

SQLLEN 和 SQLULEN 的定义已针对 64 位编译器进行更改:

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

尽管 SQL_C_BOOKMARK 在 ODBC 3.0 中已弃用,但对于 2.0 客户端上的 64 位编译器,该值已更改:

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

书签类型在较新的标头中以不同的方式定义:

typedef SQLULEN BOOKMARK;  

通过指针从 ODBC API 调用返回值

以下 ODBC 函数调用将指向缓冲区的指针作为输入参数,并在该缓冲区中从驱动程序返回数据。 返回数据的上下文和含义由函数的其他输入参数确定。 在某些情况下,这些方法现在可以返回 64 位(8 字节)整数值,不会返回典型的 32 位(4 字节)整数值。 这些情况如下所示:

SQLColAttribute

如果 FieldIdentifier 参数具有以下值之一,则会在 *NumericAttribute 中返回 64 位值:

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

如果 fDescType 参数具有以下值之一,则会在 *pfDesc 中返回 64 位值:

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

如果 Attribute 参数具有以下值之一,则会在 Value 中返回 64 位值:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLGetConnectOption

如果 Attribute 参数具有以下值之一,则会在 Value 中返回 64 位值:

SQL_ATTR_QUIET_MODE

SQLGetDescField

如果 FieldIdentifier 参数具有以下值之一,则会在 *ValuePtr 中返回 64 位值:

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

如果 DiagIdentifier 参数具有以下值之一,则会在 *DiagInfoPtr 中返回 64 位值:

SQL_DIAG_CURSOR_ROW_COUNT

SQL_DIAG_ROW_COUNT

SQL_DIAG_ROW_NUMBER

SQLGetInfo

如果 InfoType 参数具有以下值之一,则会在 *InfoValuePtr 中返回 64 位值:

SQL_DRIVER_HDBC

SQL_DRIVER_HENV

SQL_DRIVER_HLIB

如果 InfoType 具有以下 2 个值之一,则 *InfoValuePtr 在输入和输出上均为 64 位:

SQL_DRIVER_HDESC

SQL_DRIVER_HSTMT

SQLGetStmtAttr

如果 Attribute 参数具有以下值之一,则会在 *ValuePtr 中返回 64 位值:

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

如果 Option 参数具有以下值之一,则会在 *Value 中返回 64 位值:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

SQLSetConnectAttr

如果 Attribute 参数具有以下值之一,则会在 Value 中传递 64 位值:

SQL_ATTR_ASYNC_ENABLE

SQL_ATTR_ENLIST_IN_DTC

SQL_ATTR_ODBC_CURSORS

SQL_ATTR_QUIET_MODE

SQLSetConnectOption

如果 Attribute 参数具有以下值之一,则会在 Value 中传递 64 位值:

SQL_ATTR_QUIET_MODE

SQLSetDescField

如果 FieldIdentifier 参数具有以下值之一,则会在 ValuePtr 中传递 64 位值:

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

如果 Attribute 参数具有以下值之一,则会在 ValuePtr 中传递 64 位值:

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

如果 Option 参数具有以下值之一,则会在 Value 中传递 64 位值:

SQL_KEYSET_SIZE

SQL_MAX_LENGTH

SQL_MAX_ROWS

SQL_ROWSET_SIZE

另请参阅

ODBC 简介