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 参考》文档的日期而定,您可能会看到被描述为 SQLINTEGER 或 SQLUINTEGER 的相同参数。

SQLLEN 和 SQLULEN 数据项在 64 位 ODBC 应用程序中为 64 位,在 32 位 ODBC 应用程序中为 32 位。SQLINTEGER 和 SQLUINTEGER 数据项在所有平台上均为 32 位。

为说明该问题,从旧版 Microsoft ODBC API 参考中摘选了以下 ODBC 函数原型。

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 参数的类型现在被设置为 SQLLEN,而不是 SQLINTEGER。对于 64 位平台,它们是 64 位,而不是 Microsoft 文档中所述的 32 位。

为避免出现跨平台编译问题,SQL Anywhere 提供了自己的 ODBC 头文件。对于 Windows 平台,您应包括 ntodbc.h 头文件。对于 Unix 平台(如 Linux),您应包括 unixodbc.h 头文件。使用这些头文件可确保与目标平台上的相应 SQL Anywhere ODBC 驱动程序兼容。

下表列出了一些在 64 位和 32 位平台上具有相同或不同存储大小的常见 ODBC 类型。

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 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 并从其返回的值已经更改,以符合 64 位应用程序的需要。例如,以下的 SQLSetStmtAttr 和 SQLSetDescField 函数值不再是 SQLINTEGER/SQLUINTEGER。此规则同样适用于 SQLGetStmtAttr 和 SQLGetDescField 函数的相应参数。

ODBC API Value/ValuePtr 变量的类型
SQLSetStmtAttr(SQL_ATTR_FETCH_BOOKMARK_PTR)

SQLLEN * 值

SQLSetStmtAttr(SQL_ATTR_KEYSET_SIZE)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_MAX_LENGTH)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_MAX_ROWS)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_PARAM_BIND_OFFSET_PTR)

SQLULEN * 值

SQLSetStmtAttr(SQL_ATTR_PARAMS_PROCESSED_PTR)

SQLULEN * 值

SQLSetStmtAttr(SQL_ATTR_PARAMSET_SIZE)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_ROW_BIND_OFFSET_PTR)

SQLULEN * 值

SQLSetStmtAttr(SQL_ATTR_ROW_NUMBER)

SQLULEN 值

SQLSetStmtAttr(SQL_ATTR_ROWS_FETCHED_PTR)

SQLULEN * 值

SQLSetDescField(SQL_DESC_ARRAY_SIZE)

SQLULEN 值

SQLSetDescField(SQL_DESC_BIND_OFFSET_PTR)

SQLLEN * 值

SQLSetDescField(SQL_DESC_ROWS_PROCESSED_PTR)

SQLULEN * 值

SQLSetDescField(SQL_DESC_DISPLAY_SIZE)

SQLLEN 值

SQLSetDescField(SQL_DESC_INDICATOR_PTR)

SQLLEN * 值

SQLSetDescField(SQL_DESC_LENGTH)

SQLLEN 值

SQLSetDescField(SQL_DESC_OCTET_LENGTH)

SQLLEN 值

SQLSetDescField(SQL_DESC_OCTET_LENGTH_PTR)

SQLLEN * 值

有关详细信息,请参见 Microsoft 文章 [external link] MDAC 2.7 中的 ODBC 64 位 API 更改