Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Начиная с 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