次の方法で共有


SQLFetchScroll (カーソル ライブラリ)

重要

この機能は、Windows の将来のバージョンで削除される予定です。 新しい開発作業ではこの機能を使用しないでください。また、現在この機能を使用しているアプリケーションの変更を計画してください。 Microsoft では、ドライバーのカーソル機能を使用することをお勧めします。

このトピックでは、カーソル ライブラリでの SQLFetchScroll 関数の使用について説明します。 SQLFetchScroll の一般的な情報については、「SQLFetchScroll 関数」を参照してください。

カーソル ライブラリは、ドライバーで SQLFetch を 繰り返し呼び出すことによって SQLFetchScroll を実装します。 ドライバーから取得したデータは、アプリケーションによって提供される行セット バッファーに転送されます。 また、データはメモリ ファイルとディスク ファイルにキャッシュされます。 アプリケーションが新しい行セットを要求すると、カーソル ライブラリは、ドライバー (以前にフェッチされていない場合) またはキャッシュ (以前にフェッチされている場合) から必要に応じてそれを取得します。 最後に、カーソル ライブラリはキャッシュされたデータの状態を保持し、この情報を行状態配列のアプリケーションに返します。

カーソル ライブラリを使用する場合、 SQLFetchScroll への呼び出しを SQLFetch または SQLExtendedFetch の呼び出しと混在させることはできません。

カーソル ライブラリを使用する場合、ODBC 2 では SQLFetchScroll の呼び出しが両方ともサポートされます。x と ODBC 3 の場合は 。x ドライバー。

行セット バッファー

カーソル ライブラリは、次の場合に、ドライバーからアプリケーションによって提供される行セット バッファーへのデータ転送を最適化します。

  • アプリケーションでは、行方向のバインドが使用されます。

  • データ行を保持するようにアプリケーションが宣言する構造のフィールド間に未使用のバイトはありません。

  • SQLFetch または SQLFetchScroll が列の長さ/インジケーターを返すフィールドは、その列のバッファーの後にあり、次の列のバッファーの前にあります。 これらのフィールドは省略可能です。

アプリケーションが新しい行セットを要求すると、カーソル ライブラリはキャッシュとドライバーから必要に応じてデータを取得します。 新しい行セットと古い行セットが重複している場合、カーソル ライブラリは、行セット バッファーの重複するセクションのデータを再利用することで、パフォーマンスを最適化できます。 したがって、新しい行セットと古い行セットが重複し、変更が行セット バッファーの重複するセクションにある場合を除き、行セット バッファーに対する保存されていない変更は失われます。 変更を保存するために、アプリケーションは配置された update ステートメントを送信します。

アプリケーションが SQLFetchScroll を呼び出し、 FetchOrientation 引数を SQL_FETCH_RELATIVEに設定し、 FetchOffset 引数を 0 に設定すると、カーソル ライブラリは常にキャッシュからのデータを使用して行セット バッファーを更新します。

カーソル ライブラリでは、カーソルを開いている間に行セットのサイズを変更するために、SQL_ATTR_ROW_ARRAY_SIZE の属性を使用した SQLSetStmtAttr の呼び出しがサポートされています。 新しい行セット サイズは、次回 SQLFetchScroll が呼び出されるときに有効になります。

結果セットのメンバーシップ

カーソル ライブラリは、アプリケーションが要求した場合にのみ、ドライバーからデータを取得します。 データ ソースと SQL_CONCURRENCY ステートメント属性の設定に応じて、次のような結果になります。

  • カーソル ライブラリによって取得されるデータは、ステートメントの実行時に使用できるデータとは異なる場合があります。 たとえば、カーソルを開いた後、現在のカーソル位置を超える位置に挿入された行は、一部のドライバーによって取得できます。

  • 結果セット内のデータは、カーソル ライブラリのデータ ソースによってロックされているため、他のユーザーが使用できない可能性があります。

カーソル ライブラリは、データの行をキャッシュした後、基になるデータ ソース内のその行への変更を検出できません (配置された更新を除き、同じカーソルのキャッシュで動作している削除も除きます)。 これは、 SQLFetchScroll の呼び出しでは、カーソル ライブラリがデータ ソースからデータを参照しないために発生します。 代わりに、キャッシュからデータを再キャッシュします。

スクロール

カーソル ライブラリでは、 SQLFetchScroll で次のフェッチ型がサポートされています。

カーソルの種類 フェッチの種類
順方向専用 SQL_FETCH_NEXT
静的 SQL_FETCH_NEXT

SQL_FETCH_PRIOR

SQL_FETCH_FIRST

SQL_FETCH_LAST

SQL_FETCH_RELATIVE

SQL_FETCH_ABSOLUTE

SQL_FETCH_BOOKMARK

エラー

SQLFetchScroll が呼び出され、SQLFetch の呼び出しの 1 つがSQL_ERRORを返すと、カーソル ライブラリは次のように進みます。 これらの手順が完了すると、カーソル ライブラリは処理を続行します。

  1. SQLGetDiagRec を呼び出してドライバーからエラー情報を取得し、ドライバー マネージャーに診断レコードとして投稿します。

  2. 診断レコードのSQL_DIAG_ROW_NUMBER フィールドを適切な値に設定します。

  3. 診断レコードのSQL_DIAG_COLUMN_NUMBER フィールドを適切な値に設定します (該当する場合)。それ以外の場合は、0 に設定されます。

  4. 行状態配列のエラー行の値をSQL_ROW_ERRORに設定します。

カーソル ライブラリが SQLFetchScroll の実装で SQLFetch を複数回呼び出した後、SQLFetch の呼び出しの 1 つによって返されたエラーまたは警告は診断レコード内にあり、SQLGetDiagRec の呼び出しによって取得できます。 フェッチ時にデータが切り捨てられた場合、切り捨てられたデータはカーソル ライブラリのキャッシュに存在するようになります。 SQLFetchScroll を呼び出して、切り捨てられたデータを含む行にスクロールすると、切り捨てられたデータが返され、カーソル ライブラリのキャッシュからデータがフェッチされるため、警告は発生しません。 返されるデータの長さを追跡して、バッファーで返されたデータが切り捨てられたかどうかを判断できるようにするには、アプリケーションで長さ/インジケーター バッファーをバインドする必要があります。

ブックマーク操作

カーソル ライブラリでは、SQL_FETCH_BOOKMARKの FetchOrientation を使用した SQLFetchScroll の呼び出しがサポートされています。 また、ブックマーク操作で使用できる FetchOffset 引数でのオフセットの指定もサポートしています。 これは、カーソル ライブラリがサポートする唯一のブックマーク操作です。 カーソル ライブラリでは 、SQLBulkOperations の呼び出しはサポートされていません。

アプリケーションが SQL_ATTR_USE_BOOKMARKS ステートメント属性を設定し、ブックマーク列にバインドしている場合、カーソル ライブラリによって固定長ブックマークが生成され、アプリケーションに返されます。 カーソル ライブラリは、使用するブックマークを作成して保持します。データ ソースで保持されているブックマークは使用しません。 SQLFetchScroll を呼び出して、データ ソースから既にフェッチされているデータ ブロックを取得すると、カーソル ライブラリ キャッシュからデータが取得されます。 その結果、SQL_FETCH_BOOKMARKの FetchOrientation を使用した SQLFetchScroll の呼び出しで使用されるブックマークは、カーソル ライブラリによって作成および管理される必要があります。

他の関数との対話

配置された更新または削除ステートメントを準備または実行する前に、アプリケーションで SQLFetch または SQLFetchScroll を呼び出す必要があります。