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 ODBC 3.x está trabajando 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 asigna la segunda llamada SQLSetStmtAttr al trabajar 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 :

  1. Inicializa un indicador interno del Administrador de Controladores fSetPosError a TRUE.

  2. Cuando una aplicación llama a SQLFetchScroll, el Administrador de controladores establece fSetPosError en FALSE.

  3. Cuando la aplicación llama a SQLSetStmtAttr para establecer SQL_ATTR_ROW_STATUS_PTR, el Administrador de controladores establece fSetPosError igual aTRUE.

  4. Cuando la aplicación llama a SQLSetPos, con fSetPosError igual a TRUE, el Administrador de controladores genera SQL_ERROR con SQLSTATE HY011 (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.