Llamar a SQLSetPos
En ODBC 2.x, el puntero a la matriz de estado de fila era un argumento para SQLExtendedFetch. La matriz de estado de fila se actualizó posteriormente mediante una llamada a SQLSetPos. Algunos controladores se han basado en el hecho de que esta matriz no cambia entre SQLExtendedFetch y SQLSetPos. En ODBC 3.x, el puntero a la matriz de estado es un campo descriptor y, por tanto, la aplicación puede cambiarla fácilmente para que apunte a una matriz diferente. Esto puede ser un problema cuando una aplicación de ODBC 3.x funciona con un controlador ODBC 2.x, pero llama a SQLSetStmtAttr para establecer el puntero de estado de la matriz y llama a SQLFetchScroll para capturar datos. El Administrador de controladores lo asigna como una secuencia de llamadas a SQLExtendedFetch. En el código siguiente, normalmente se produciría un error cuando el Administrador de controladores asignara la segunda llamada SQLSetStmtAttr al funcionar con un controlador ODBC 2.x:
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);
El error se produciría si no hubiera ninguna manera de cambiar el puntero de estado de fila en ODBC 2.x entre llamadas a SQLExtendedFetch. En su lugar, el Administrador de controladores realiza los pasos siguientes al trabajar con un controlador ODBC 2.x:
Inicializa una marca fSetPosError interna del Administrador de controladores en TRUE.
Cuando una aplicación llama a SQLFetchScroll, el Administrador de controladores establece fSetPosError en FALSE.
Cuando la aplicación llama a SQLSetStmtAttr para establecer SQL_ATTR_ROW_STATUS_PTR, el Administrador de controladores establece fSetPosError igual a TRUE.
Cuando la aplicación llama a SQLSetPos con fSetPosError igual a TRUE, el Administrador de controladores genera SQL_ERROR con SQLSTATE HY011 (el atributo no se puede establecer ahora) para indicar que la aplicación intentó llamar a SQLSetPos después de cambiar el puntero de estado de fila pero antes de llamar a SQLFetchScroll.