ODBC 64 ビットの情報
Windows Server 2003 以降、Microsoft オペレーティング システムでは 64 ビット ODBC ライブラリがサポートされています。 MDAC 2.7 SDK で最初に付属した ODBC ヘッダーとライブラリには、プログラマーが新しい 64 ビット プラットフォーム用のコードを簡単に記述できるようになる変更が含まれています。 以下に示した ODBC 定義型をコードで使用すると、_WIN64 マクロまたは WIN32 マクロに基づいて、64 ビットプラットフォームと 32 ビット プラットフォームの両方で同じソース コードをコンパイルできます。
64 ビット プロセッサをプログラミングする際には、いくつかの点に留意する必要があります。
ポインターのサイズは 4 バイトから 8 バイトに変更されましたが、integer と long は引き続き 4 バイトの値です。 INT64 型と UINT64 型は、8 バイト整数に対して定義されています。 新しい ODBC 型である SQLLEN と SQLULEN は、_WIN64 が定義されている場合、ODBC ヘッダー ファイルでは INT64 および UINT64 として定義されています。
ODBC のいくつかの関数は、ポインター パラメーターを受け取るように宣言されています。 32 ビット ODBC では、ポインターとして定義されたパラメーターは、呼び出しのコンテキストに応じて整数値またはバッファーへのポインターを渡すために頻繁に使用されていました。 これが可能だったのは、もちろん、ポインターと整数のサイズが同じであったためです。 64 ビット Windows では、そうではありません。
これまで SQLINTEGER パラメーターと SQLUINTEGER パラメーターを使用して定義されていた一部の ODBC 関数は、新しい SQLLEN および SQLULEN typedef を使用するのが適切な場所では変更されました。 これらの変更については、次のセクション「関数宣言の変更」に示します。
さまざまな 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 データ型の変更点
次の 4 つの 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
64 ビット コンパイラでは、SQLLEN と SQLULEN の定義が変更されました。
#ifdef _WIN64
typedef INT64 SQLLEN;
typedef UINT64 SQLULEN;
#else
#define SQLLEN SQLINTEGER
#define SQLULEN SQLUINTEGER
#endif
ODBC 3.0 では SQL_C_BOOKMARK は非推奨になりましたが、2.0 クライアントの 64 ビット コンパイラでは、この値が変更されました。
#ifdef _WIN64
#define SQL_C_BOOKMARK SQL_C_UBIGINT
#else
#define SQL_C_BOOKMARK SQL_C_ULONG
#endif
BOOKMARK 型は、新しいヘッダーでは異なる方法で定義されています。
typedef SQLULEN BOOKMARK;
ポインターを介した ODBC API 呼び出しから返される値
次の ODBC 関数呼び出しは、ドライバーからデータが返されるバッファーへのポインターを入力パラメーターとして受け取ります。 返されるデータのコンテキストと意味は、関数の他の入力パラメーターによって決まります。 場合によっては、これらのメソッドは、通常の 32 ビット (4 バイト) 整数値ではなく、64 ビット (8 バイト整数) 値を返す場合があります。 このようなケースは次のとおりです。
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