Partilhar via


Chamando SQLSetPos

No ODBC 2.x, o apontador para o array de estado da linha era um argumento para SQLExtendedFetch. O array de estado de linhas foi posteriormente atualizado através de uma chamada ao SQLSetPos. Alguns drivers basearam-se no facto de este array não mudar entre SQLExtendedFetch e SQLSetPos. No ODBC 3.x, o ponteiro para o array de estado é um campo descritor e, por isso, a aplicação pode facilmente alterá-lo para apontar para um array diferente. Isto pode ser um problema quando uma aplicação ODBC 3.x está a trabalhar com um driver ODBC 2.x mas está a chamar SQLSetStmtAttr para definir o ponteiro de estado do array e está a chamar SQLFetchScroll para obter dados. O Gestor de Drivers mapeia-o como uma sequência de chamadas para SQLExtendedFetch. No código seguinte, normalmente surgiria um erro quando o Gestor de Drivers mapeia a segunda chamada SQLSetStmtAttr ao trabalhar com um driver 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);  

O erro surgiria se não houvesse forma de alterar o ponteiro de estado da linha no ODBC 2.x entre chamadas para SQLExtendedFetch. Em vez disso, o Gestor de Drivers executa os seguintes passos ao trabalhar com um driver ODBC 2.x :

  1. Inicializa uma flag interna do Driver Manager, fSetPosError, para TRUE.

  2. Quando uma aplicação chama SQLFetchScroll, o Gestor de Drivers define fSetPosError como FALSE.

  3. Quando a aplicação chama SQLSetStmtAttr para definir SQL_ATTR_ROW_STATUS_PTR, o Gestor de Drivers define fSetPosError igual a TRUE.

  4. Quando a aplicação chama SQLSetPos, com fSetPosError igual a TRUE, o Gestor de Drivers levanta SQL_ERROR com SQLSTATE HY011 (Atributo não pode ser definido agora) para indicar que a aplicação tentou chamar SQLSetPos após alterar o ponteiro de estado da linha mas antes de chamar SQLFetchScroll.