Partilhar via


Chamar SQLSetPos

No ODBC 2.x, o ponteiro para a matriz de status da linha era um argumento para SQLExtendedFetch. A matriz de status da linha foi atualizada posteriormente com uma chamada para SQLSetPos. Alguns drivers se basearam no fato de que essa matriz não muda entre SQLExtendedFetch e SQLSetPos. No ODBC 3.x, o ponteiro para a matriz de status é um campo descritor e, portanto, o aplicativo pode facilmente alterá-lo para apontar para uma matriz diferente. Isso pode ser um problema quando um aplicativo ODBC 3.x está funcionando com um driver ODBC 2.x, mas chama SQLSetStmtAttr para definir o ponteiro de status da matriz e chama SQLFetchScroll para buscar dados. O Gerenciador de Driver o mapeia como uma sequência de chamadas para SQLExtendedFetch. No código a seguir, um erro normalmente seria gerado quando o Gerenciador de Driver mapeia a segunda chamada para SQLSetStmtAttr funcionando 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 seria gerado se não houvesse nenhuma maneira de alterar o ponteiro do status da linha no ODBC 2.x entre chamadas para SQLExtendedFetch. Em vez disso, o Gerenciador de Driver executa as seguintes etapas ao trabalhar com um driver ODBC 2.x:

  1. Inicializa um sinalizador fSetPosError interno do Gerenciador de Driver para VERDADEIRO.

  2. Quando um aplicativo chama SQLFetchScroll, o Gerenciador de Driver define fSetPosError como FALSO.

  3. Quando o aplicativo chama SQLSetStmtAttr para definir SQL_ATTR_ROW_STATUS_PTR, o Gerenciador de Driver define fSetPosError igual a VERDADEIRO.

  4. Quando um aplicativo chama SQLSetPos com fSetPosError igual a VERDADEIRO, o Gerenciador de Driver gera SQL_ERROR com SQLSTATE HY011 (O atributo não pode ser definido no momento) para indicar que o aplicativo tentou chamar SQLSetPos depois de alterar o ponteiro de status da linha mas antes de chamar SQLFetchScroll.