次の方法で共有


SQLSetPos の呼び出し

ODBC 2.x では、行状態配列へのポインターは SQLExtendedFetch の引数でした。 行の状態配列は、後で SQLSetPos の呼び出しによって更新されました。 一部のドライバーは、この配列が SQLExtendedFetchSQLSetPos の間で変更されないという事実に依存しています。 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 ドライバーを操作するときに、次の手順を実行します。

  1. 内部ドライバー マネージャー フラグ fSetPosError を TRUE に初期化します。

  2. アプリケーションが SQLFetchScroll を呼び出すと、ドライバー マネージャーは fSetPosError を FALSE に設定します。

  3. アプリケーションが SQLSetStmtAttr を呼び出してSQL_ATTR_ROW_STATUS_PTRを設定すると、ドライバー マネージャーは fSetPosError をTRUE に設定します。

  4. fSetPosError が TRUE で、アプリケーションが SQLSetPos を呼び出すと、ドライバー マネージャーは SQLSTATE HY011 で SQL_ERROR を発生させ (現在は属性を設定できません)、行ステータス ポインターを変更した後、SQLFetchScroll を呼び出す前に、アプリケーションが SQLSetPos を呼び出そうとしたことを示します。