Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere ODBC API

 

64 ビット ODBC での考慮事項

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 の『[external link] ODBC 64-Bit API Changes in MDAC 2.7』を参照してください。