SQLBindCol、SQLBindParameter、SQLGetData などの ODBC 関数を使用する場合、一部のパラメータは SQLLEN や SQLULEN として関数プロトタイプに型指定されます。参照している Microsoft の『ODBC API Reference』マニュアルによっては、同じパラメータが SQLINTEGER や SQLUINTEGER として記述されている場合があります。
SQLLEN および SQLULEN のデータ項目は、64 ビットの ODBC アプリケーションでは 64 ビット、32 ビットの ODBC アプリケーションでは 32 ビットになります。SQLINTEGER および SQLUINTEGER のデータ項目は、すべてのプラットフォームで 32 ビットです。
この問題を説明するために、次の ODBC 関数プロトタイプを Microsoft の旧版の『ODBC API Reference』から抜粋しました。
SQLRETURN SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLINTEGER *StrLen_or_IndPtr); |
Microsoft Visual Studio バージョン 8 の sql.h にある実際の関数プロトタイプと比較してください。
SQLRETURN SQL_API SQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind); |
BufferLength パラメータと StrLen_or_Ind パラメータが、SQLINTEGER 型ではなく SQLLEN 型と指定されるようになったことがわかります。64 ビットのプラットフォームでは、32 ビット数ではなく 64 ビット数であることが Microsoft のマニュアルからわかります。
異種プラットフォーム間でのコンパイルの問題を回避するために、SQL Anywhere には独自の ODBC ヘッダ・ファイルがあります。Windows プラットフォームの場合は、ntodbc.h ヘッダ・ファイルをインクルードしてください。Linux などの UNIX プラットフォームの場合は、unixodbc.h ヘッダ・ファイルをインクルードしてください。これらのヘッダ・ファイルを使用することで、対象プラットフォーム用の SQL Anywhere ODBC ドライバとの互換性が確保されます。
次の表に示すのは、一般的な ODBC のタイプの一部です。64 ビットのプラットフォームと 32 ビットのプラットフォームでストレージ・サイズが同じものもあれば、異なるものもあります。
ODBC API | 64 ビットのプラットフォーム | 32 ビットのプラットフォーム |
---|---|---|
SQLINTEGER | 32 ビット | 32 ビット |
SQLUINTEGER | 32 ビット | 32 ビット |
SQLLEN | 64 ビット | 32 ビット |
SQLULEN | 64 ビット | 32 ビット |
SQLSETPOSIROW | 64 ビット | 16 ビット |
SQL_C_BOOKMARK | 64 ビット | 32 ビット |
BOOKMARK | 64 ビット | 32 ビット |
データ変数とパラメータを間違って宣言すると、ソフトウェアが正しく動作しない可能性があります。
次の表は、64 ビットのサポートが導入された後で変更された、ODBC API の関数プロトタイプをまとめたものです。影響を受けるパラメータが記載されています。関数プロトタイプで使用される実際のパラメータ名と Microsoft のマニュアルに記載されているパラメータ名が異なる場合は、Microsoft の記載名がカッコ内に示されています。パラメータ名は、Microsoft Visual Studio バージョン 8 のヘッダ・ファイルで使用されるものです。
ODBC API | パラメータ (マニュアル記載のパラメータ名) |
---|---|
SQLBindCol |
SQLLEN BufferLength SQLLEN *Strlen_or_Ind |
SQLBindParam |
SQLULEN LengthPrecision SQLLEN *Strlen_or_Ind |
SQLBindParameter |
SQLULEN cbColDef (ColumnSize) SQLLEN cbValueMax (BufferLength) SQLLEN *pcbValue (Strlen_or_IndPtr) |
SQLColAttribute |
SQLLEN *NumericAttribute |
SQLColAttributes |
SQLLEN *pfDesc |
SQLDescribeCol |
SQLULEN *ColumnSize (ColumnSizePtr) |
SQLDescribeParam |
SQLULEN *pcbParamDef (ParameterSizePtr) |
SQLExtendedFetch |
SQLLEN irow (FetchOffset) SQLULEN *pcrow (RowCountPtr) |
SQLFetchScroll |
SQLLEN FetchOffset |
SQLGetData |
SQLLEN BufferLength SQLLEN *Strlen_or_Ind (Strlen_or_IndPtr) |
SQLGetDescRec |
SQLLEN *Length (LengthPtr) |
SQLParamOptions |
SQLULEN crow, SQLULEN *pirow |
SQLPutData |
SQLLEN Strlen_or_Ind |
SQLRowCount |
SQLLEN *RowCount (RowCountPtr) |
SQLSetConnectOption |
SQLULEN Value |
SQLSetDescRec |
SQLLEN Length SQLLEN *StringLength (StringLengthPtr) SQLLEN *Indicator (IndicatorPtr) |
SQLSetParam |
SQLULEN LengthPrecision SQLLEN *Strlen_or_Ind (Strlen_or_IndPtr) |
SQLSetPos |
SQLSETPOSIROW irow (RowNumber) |
SQLSetScrollOptions |
SQLLEN crowKeyset |
SQLSetStmtOption |
SQLULEN Value |
ポインタを介して ODBC API 呼び出しに渡され、ODBC API 呼び出しから返される値の一部は、64 ビットのアプリケーションに対応するために変更されました。たとえば、次の SQLSetStmtAttr および SQLSetDescField 関数の値は、SQLINTEGER/SQLUINTEGER ではなくなりました。SQLGetStmtAttr および SQLGetDescField 関数の該当するパラメータに関しても同様です。
ODBC API | Value/ValuePtr 変数の型 |
---|---|
SQLSetStmtAttr(SQL_ATTR_FETCH_BOOKMARK_PTR) |
SQLLEN * value |
SQLSetStmtAttr(SQL_ATTR_KEYSET_SIZE) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_MAX_LENGTH) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_MAX_ROWS) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_PARAM_BIND_OFFSET_PTR) |
SQLULEN * value |
SQLSetStmtAttr(SQL_ATTR_PARAMS_PROCESSED_PTR) |
SQLULEN * value |
SQLSetStmtAttr(SQL_ATTR_PARAMSET_SIZE) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_ROW_BIND_OFFSET_PTR) |
SQLULEN * value |
SQLSetStmtAttr(SQL_ATTR_ROW_NUMBER) |
SQLULEN value |
SQLSetStmtAttr(SQL_ATTR_ROWS_FETCHED_PTR) |
SQLULEN * value |
SQLSetDescField(SQL_DESC_ARRAY_SIZE) |
SQLULEN value |
SQLSetDescField(SQL_DESC_BIND_OFFSET_PTR) |
SQLLEN * value |
SQLSetDescField(SQL_DESC_ROWS_PROCESSED_PTR) |
SQLULEN * value |
SQLSetDescField(SQL_DESC_DISPLAY_SIZE) |
SQLLEN value |
SQLSetDescField(SQL_DESC_INDICATOR_PTR) |
SQLLEN * value |
SQLSetDescField(SQL_DESC_LENGTH) |
SQLLEN value |
SQLSetDescField(SQL_DESC_OCTET_LENGTH) |
SQLLEN value |
SQLSetDescField(SQL_DESC_OCTET_LENGTH_PTR) |
SQLLEN * value |
詳細については、Microsoft の『 ODBC 64-Bit API Changes in MDAC 2.7』を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |