SQLSetPos の呼び出し
ODBC 2.x では、行状態配列へのポインターは SQLExtendedFetch の引数でした。 行の状態配列は、後で SQLSetPos の呼び出しによって更新されました。 一部のドライバーは、この配列が SQLExtendedFetch と SQLSetPos の間で変更されないという事実に依存しています。 ODBC 3.x では、状態配列へのポインターは記述子フィールドであるため、アプリケーションは別の配列を指すように簡単に変更できます。 これは、ODBC 3.x アプリケーションが ODBC 2.x ドライバーを操作しているが、SQLSetStmtAttr を呼び出して配列状態ポインターを設定し、SQLFetchScroll を呼び出してデータをフェッチしている場合に問題になる可能性があります。 ドライバー マネージャーは、SQLExtendedFetch への一連の呼び出しとしてマップします。 次のコードでは、通常、ODBC 2.x ドライバーを操作するときに、ドライバー マネージャーが 2 番目の 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 に設定します。
fSetPosError が TRUE で、アプリケーションが SQLSetPos を呼び出すと、ドライバー マネージャーは SQLSTATE HY011 で SQL_ERROR を発生させ (現在は属性を設定できません)、行ステータス ポインターを変更した後、SQLFetchScroll を呼び出す前に、アプリケーションが SQLSetPos を呼び出そうとしたことを示します。