Chiamata di SQLSetPos

In ODBC 2.x il puntatore alla matrice di stato della riga era un argomento di SQLExtendedFetch. La matrice di stato della riga è stata aggiornata successivamente da una chiamata a SQLSetPos. Alcuni driver si sono basati sul fatto che questa matrice non cambia da SQLExtendedFetch a SQLSetPos. In ODBC 3.x il puntatore alla matrice di stato è un campo descrittore, pertanto l'applicazione può facilmente modificarlo in modo che punti a una matrice diversa. Questo può essere un problema quando un'applicazione ODBC 3.x usa un driver ODBC 2.x, ma chiama SQLSetStmtAttr per impostare il puntatore di stato della matrice e chiama SQLFetchScroll per recuperare i dati. Gestione driver esegue il mapping come una sequenza di chiamate a SQLExtendedFetch. Nel codice seguente, normalmente verrebbe generato un errore quando Gestione driver esegue il mapping della seconda chiamata SQLSetStmtAttr quando si usa un 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);  

L'errore verrà generato se non fosse possibile modificare il puntatore dello stato della riga in ODBC 2.x tra le chiamate a SQLExtendedFetch. Gestione driver esegue invece i passaggi seguenti quando si usa un driver ODBC 2.x:

  1. Inizializza un flag interno di Gestione driver fSetPosError su TRUE.

  2. Quando un'applicazione chiama SQLFetchScroll, Gestione driver imposta fSetPosError su FALSE.

  3. Quando l'applicazione chiama SQLSetStmtAttr per impostare SQL_ATTR_ROW_STATUS_PTR, Gestione driver imposta fSetPosError uguale a TRUE.

  4. Quando l'applicazione chiama SQLSetPos con fSetPosError uguale a TRUE, Gestione driver genera SQL_ERROR con SQLSTATE HY011 (l'attributo non può essere impostato ora) per indicare che l'applicazione ha tentato di chiamare SQLSetPos dopo aver modificato il puntatore allo stato della riga ma prima di chiamare SQLFetchScroll.