调用 SQLSetPos
在 ODBC 2.x 中,指向行状态数组的指针是 SQLExtendedFetch 的参数。 稍后,通过调用 SQLSetPos 来更新行状态数组。 某些驱动程序依赖于此数组不会在 SQLExtendedFetch 和 SQLSetPos 之间更改这一事实。 在 ODBC 3.x 中,指向状态数组的指针是描述符字段,因此应用程序可以轻松地将其更改为指向其他数组。 如果 ODBC 3.x 应用程序使用 ODBC 2.x 驱动程序,但需要调用 SQLSetStmtAttr 来设置数组状态指针并调用 SQLFetchScroll 来提取数据,这可能是一个问题。 驱动程序管理器将其映射为对 SQLExtendedFetch 的一系列调用。 在以下代码中,当使用 ODBC 2.x 驱动程序时,如果驱动程序管理器映射第二个 SQLSetStmtAttr 调用,则通常会引发错误:
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStatus, 0);
SQLFetchScroll(hstmt, fFetchType, iRow);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, rgfRowStat1, 0);
SQLSetPos(hstmt, iRow, fOption, fLock);
如果在两次调用 SQLExtendedFetch 之间无法更改 ODBC 2.x 中的行状态指针,则会引发错误。 相反,驱动程序管理器在使用 ODBC 2.x 驱动程序时会执行以下步骤:
将内部驱动程序管理器标志 fSetPosError 初始化为 TRUE。
当应用程序调用 SQLFetchScroll 时,驱动程序管理器会将 fSetPosError 设置为 FALSE。
当应用程序调用 SQLSetStmtAttr 来设置 SQL_ATTR_ROW_STATUS_PTR 时,驱动程序管理器会将 fSetPosError 设置为等于 TRUE。
当应用程序调用 SQLSetPos 且将 fSetPosError 设置为等于 TRUE 时,驱动程序管理器将引发包含 SQLSTATE HY011 的 SQL_ERROR 错误(现在无法设置属性),以指示应用程序在更改行状态指针后但在调用 SQLFetchScroll 之前曾尝试调用 SQLSetPos。