Сведения о 64-разрядном интерфейсе ODBC
Начиная с Windows Server 2003 операционные системы Майкрософт поддерживают 64-разрядные библиотеки ODBC. Заголовки и библиотеки ODBC, впервые отправленные с пакетом SDK MDAC 2.7, содержат изменения, позволяющие программистам легко писать код для новых 64-разрядных платформ. Убедись, что код использует определенные типы ODBC, перечисленные ниже, можно скомпилировать один и тот же исходный код для 64-разрядных и 32-разрядных платформ на основе макросов _WIN64 или WIN32 .
При программировании для 64-разрядного процессора следует учитывать несколько моментов:
Хотя размер указателя изменился с 4 байта на 8 байт, целые числа и длинные значения по-прежнему равны 4 байтам. Типы INT64 и UINT64 определены для 8 целых чисел. Новые типы ODBC SQLLEN и SQLULEN определяются в файле заголовка ODBC как INT64 и UINT64 при определении _WIN64.
Несколько функций в ODBC объявляются как принимающие параметр указателя. В 32-разрядном ODBC параметры, определенные как указатели, часто используются для передачи целочисленного значения или указателя на буфер в зависимости от контекста вызова. Это было, конечно, возможно из-за того, что указатели и целые числа имели тот же размер. В 64-разрядной версии Windows это не так.
Некоторые функции ODBC, которые ранее были определены с параметрами SQLINTEGER и SQLUINTEGER , были изменены при необходимости использования новых типов SQLLEN и SQLULEN . Эти изменения перечислены в следующем разделе , изменения объявления функции.
Некоторые поля дескриптора, которые можно задать с помощью различных функций 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, для 64-разрядных компиляторов на клиентах 2.0 это значение изменилось:
#ifdef _WIN64
#define SQL_C_BOOKMARK SQL_C_UBIGINT
#else
#define SQL_C_BOOKMARK SQL_C_ULONG
#endif
Тип BOOKMARK определяется иначе в новых заголовках:
typedef SQLULEN BOOKMARK;
Значения, возвращаемые из вызовов API ODBC через указатели
Следующие вызовы функции ODBC принимают в качестве входного параметра указатель на буфер, в котором данные возвращаются из драйвера. Контекст и значение возвращаемых данных определяется другими входными параметрами для функций. В некоторых случаях эти методы теперь могут возвращать 64-разрядные (8-байтовые целочисленные) значения вместо типичных 32-разрядных (4-байтовых) целых значений. Ниже приведены следующие случаи.
SQLColAttribute
Если параметр FieldIdentifier имеет одно из следующих значений, 64-разрядное значение возвращается в *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
Если параметр fDescType имеет одно из следующих значений, 64-разрядное значение возвращается в *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
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение возвращается в значение:
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLGet Подключение Option
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение возвращается в значение:
SQL_ATTR_QUIET_MODE
SQLGetDescField
Если параметр FieldIdentifier имеет одно из следующих значений, 64-разрядное значение возвращается в *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
Если параметр DiagIdentifier имеет одно из следующих значений, 64-разрядное значение возвращается в *DiagInfoPtr:
SQL_DIAG_CURSOR_ROW_COUNT
SQL_DIAG_ROW_COUNT
SQL_DIAG_ROW_NUМБ ER
SQLGetInfo
Если параметр InfoType имеет одно из следующих значений, 64-разрядное значение возвращается в *InfoValuePtr:
SQL_DRIVER_HDBC
SQL_DRIVER_HENV
SQL_DRIVER_HLIB
Если InfoType имеет одно из следующих двух значений *InfoValuePtr имеет 64-разрядные значения для входных и выходных данных:
SQL_DRIVER_HDESC
SQL_DRIVER_HSTMT
SQLGetStmtAttr
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение возвращается в *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_NUМБ ER
SQL_ATTR_ROW_OPERATION_PTR
SQL_ATTR_ROW_STATUS_PTR
SQL_ATTR_SIMULATE_CURSOR
SQL_ATTR_USE_BOOKMARKS
SQLGetStmtOption
Если параметр Option имеет одно из следующих значений, 64-разрядное значение возвращается в *Value:
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE
SQLSetConnectAttr
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение передается в значение:
SQL_ATTR_ASYNC_ENABLE
SQL_ATTR_ENLIST_IN_DTC
SQL_ATTR_ODBC_CURSORS
SQL_ATTR_QUIET_MODE
SQLSet Подключение Option
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение передается в значение:
SQL_ATTR_QUIET_MODE
SQLSetDescField
Если параметр FieldIdentifier имеет одно из следующих значений, 64-разрядное значение передается в 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
Если параметр Attribute имеет одно из следующих значений, 64-разрядное значение передается в 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_NUМБ 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
Если параметр Option имеет одно из следующих значений, 64-разрядное значение передается в значение:
SQL_KEYSET_SIZE
SQL_MAX_LENGTH
SQL_MAX_ROWS
SQL_ROWSET_SIZE