Freigeben über


Aufrufen von SQLSetPos

In ODBC 2.x war der Zeiger auf das Zeilenstatusarray ein Argument für SQLExtendedFetch. Das Zeilenstatusarray wurde später durch einen Aufruf von SQLSetPos aktualisiert. Einige Treiber haben sich darauf verlassen, dass sich dieses Array nicht zwischen SQLExtendedFetch und SQLSetPos ändert. In ODBC 3.x ist der Zeiger auf das Statusarray ein Deskriptorfeld, und daher kann die Anwendung es ganz einfach ändern, um auf ein anderes Array zu verweisen. Dies kann ein Problem sein, wenn eine ODBC 3.x-Anwendung mit einem ODBC 2.x-Treiberarbeitet, aber SQLSetStmtAttr aufruft, um den Arraystatuszeiger festzulegen und SQLFetchScroll zum Abrufen von Daten aufzurufen. Der Treiber-Manager ordnet ihn als Abfolge von Aufrufen von SQLExtendedFetch zu. Im folgenden Code würde normalerweise ein Fehler ausgelöst, wenn der Treiber-Manager beim Arbeiten mit einem ODBC 2.x-Treiber den zweiten SQLSetStmtAttr-Aufrufzuordnet:

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);  

Der Fehler würde ausgelöst, wenn es keine Möglichkeit gab, den Zeilenstatuszeiger in ODBC 2.x zwischen Aufrufen von SQLExtendedFetch zu ändern. Stattdessen führt der Treiber-Manager beim Arbeiten mit einem ODBC 2.x-Treiber die folgenden Schritte aus:

  1. Initialisiert ein internes Treiber-Manager-Flag "fSetPosError " auf TRUE.

  2. Wenn eine Anwendung SQLFetchScroll aufruft, legt der Treiber-Manager fSetPosError auf FALSE fest.

  3. Wenn die Anwendung SQLSetStmtAttr aufruft, um SQL_ATTR_ROW_STATUS_PTR festzulegen, legt der Treiber-Manager fSetPosError gleichTRUE fest.

  4. Wenn die Anwendung SQLSetPos aufruft, wobei fSetPosError gleich TRUE ist, löst der Treiber-Manager SQL_ERROR mit SQLSTATE HY011 aus (Attribut kann jetzt nicht festgelegt werden), um anzugeben, dass die Anwendung versucht hat, SQLSetPos nach dem Ändern des Zeilenstatuszeigers, aber vor dem Aufrufen von SQLFetchScroll aufzurufen.