相対と絶対のスクロール

SQLFetchScroll のスクロール オプションのほとんどは、カーソルを現在の位置または絶対位置に対して相対的に配置します。 SQLFetchScroll では、次、前、最初、および最後の行セットのフェッチ、および相対フェッチ (現在の行セットの先頭から行セット n 行をフェッチ) と絶対フェッチ (行 n から始まる行セットのフェッチ) がサポートされます。 絶対フェッチで n が負の場合、結果セットの末尾から行がカウントされます。 たとえば、行 -1 の絶対フェッチは、結果セット内にある最後の行を起点とした行セットをフェッチします。

動的カーソルは、結果セットに挿入された行と結果セットから削除された行を検出するため、動的カーソルが結果セットの先頭からの読み取り以外の特定の数の行を取得する簡単な方法はありません。これは遅くなる可能性があります。 さらに、絶対フェッチは、行の挿入と削除に合わせて行番号が変更されるため、動的カーソルではあまり役に立ちません。そのため、同じ行番号を連続してフェッチすると、異なる行が生成される可能性があります。

レポートなどのブロック カーソル機能にのみ SQLFetchScroll を使用するアプリは、次の行セットをフェッチするオプションのみを使用して、結果セットを 1 回渡す可能性があります。 一方、画面ベースのアプリでは、SQLFetchScroll のすべての機能を利用できます。 アプリが行セットのサイズを画面に表示される行数に設定し、画面バッファーを結果セットにバインドする場合、スクロール バー操作を SQLFetchScroll の呼び出しに直接変換できます。

スクロール バーの操作 SQLFetchScroll のスクロール操作
1 画面分上へ移動 (PageUp) SQL_FETCH_PRIOR
1 画面分下へ移動 (PageDown) SQL_FETCH_NEXT
1 行上へ移動 FetchOffset に -1 を指定した SQL_FETCH_RELATIVE
1 行下へ移動 FetchOffset に 1 を指定した SQL_FETCH_RELATIVE
スクロール ボックスを先頭に移動 SQL_FETCH_FIRST
スクロール ボックスを末尾に移動 SQL_FETCH_LAST
スクロール ボックスを任意の位置に移動 SQL_FETCH_ABSOLUTE

このようなアプリでは、スクロール操作の後にスクロール ボックスを配置する必要もあります。そのためには、現在の行番号と行数が必要です。 現在の行番号の場合、アプリは現在の行番号を追跡するか、SQL_ATTR_ROW_NUMBER 属性を使用して SQLGetStmtAttr を呼び出して取得できます。

カーソル内の行数 (結果セットのサイズ) は、診断ヘッダーのSQL_DIAG_CURSOR_ROW_COUNTフィールドとして使用できます。 このフィールドの値は、SQLExecuteSQLExecDirect、または SQLMoreResult が呼び出された後にのみ定義されます。 この数は、ドライバーの機能に応じて、おおよその数または正確な数のいずれかになります。 ドライバーのサポートは、カーソル属性の情報型を使用して SQLGetInfo を呼び出し、カーソルの種類に対して SQL_CA2_CRC_APPROXIMATE ビットまたは SQL_CA2_CRC_EXACT ビットが返されるかどうかを確認することで決定できます。

動的カーソルでは、正確な行数はサポートされません。 他の種類のカーソルの場合、ドライバーは正確な行数またはおおよその行数をサポートできますが、両方をサポートすることはできません。 ドライバーが特定のカーソルの種類に対して正確な行数と近似行数の両方をサポートしていない場合、SQL_DIAG_CURSOR_ROW_COUNT フィールドには、これまでにフェッチされた行の数が含まれます。 ドライバーがサポートする内容に関係なく、SQL_FETCH_LAST の操作を使用した SQLFetchScroll により、SQL_DIAG_CURSOR_ROW_COUNT フィールドに正確な行数が含まれます。