呼叫 SQLSetPos
在 ODBC 2.x 中,資料列狀態陣列的指標是 SQLExtendedFetch 的引數。 對 SQLSetPos 進行的呼叫稍後更新資料列狀態陣列。 某些驅動程式依賴此陣列不會在 SQLExtendedFetch 與 SQLSetPos 之間變更的事實。 在 ODBC 3.x 中,狀態陣列的指標是描述項欄位,因此應用程式可以輕鬆地將此變更為指向不同的陣列。 ODBC 3.x 應用程式使用 ODBC 2.x 驅動程式,但呼叫 SQLSetStmtAttr 來設定陣列狀態指標,並呼叫 SQLFetchScroll 來擷取資料時,可能會發生此問題。 驅動程式管理員會將此對應為 SQLExtendedFetch 的呼叫序列。 在下列程式碼中,當驅動程式管理員在處理 ODBC 2.x 驅動程式的情況下對應第二個 SQLSetStmtAttr 呼叫時,通常會引發錯誤:
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);
如果在對 SQLExtendedFetch 的呼叫之間無法變更 ODBC 2.x 中的資料列狀態指標,就會引發此錯誤。 相反地,驅動程式管理員會在使用 ODBC 2.x 驅動程式時執行下列步驟:
將內部驅動程式管理員旗標 fSetPosError 初始化為 TRUE。
應用程式呼叫 SQLFetchScroll 時,驅動程式管理員會將 fSetPosError 設定為 FALSE。
應用程式呼叫 SQLSetStmtAttr 來設定SQL_ATTR_ROW_STATUS_PTR 時,驅動程式管理員會設定 fSetPosError 等於 TRUE。
應用程式呼叫 SQLSetPos,而且 fSetPosError 等於 TRUE 時,驅動程式管理員會引發 SQL_ERROR 和 SQLSTATE HY011 (屬性目前無法設定) 以指出應用程式在嘗試在變更資料列狀態指標之後,但在 SQLFetchScroll 之前呼叫 SQLSetPos。