次の方法で共有


ODBC 3.x アプリ用のブロック カーソル、スクロール可能なカーソル、および下位互換性

SQLFetchScrollSQLExtendedFetch の両方の存在は、アプリケーションが呼び出す関数のセットであるアプリケーション プログラミング インターフェイス (API) と、ドライバーが実装する関数のセットであるサービス プロバイダー インターフェイス (SPI) との間の ODBC での最初の明確な分割を表します。 この分割は、SQLFetchScroll を使用する ODBC 3.x の要件のバランスをとり、標準に準拠し、SQLExtendedFetch を使用する ODBC 2.x との互換性を保つために必要です。

アプリケーションが呼び出す関数のセットである ODBC 3.x API には、SQLFetchScroll および関連ステートメント属性が含まれています。 ドライバーが実装する関数のセットである ODBC 3.x SPI には、SQLFetchScrollSQLExtendedFetch、および関連ステートメント属性が含まれます。 ODBC は API と SPI の間でこの分割を正式に強制しないため、ODBC 3.x アプリケーションで SQLExtendedFetch および関連ステートメント属性を呼び出す可能性があります。 ただし、ODBC 3.x アプリケーションでこれを行う理由はありません。 API と API の詳細については、ODBC アーキテクチャの概要を参照してください。

ODBC 3.x ドライバー マネージャーが呼び出しを ODBC 2.x および ODBC 3.x ドライバーにマップする方法、および ODBC 3.x ドライバーがブロック カーソルとスクロール可能カーソルに対して実装する必要がある関数とステートメント属性については、「付録 G: 下位互換性に関するドライバーのガイドライン」の「ドライバーの動作」を参照してください。

次の表は、ODBC 3.x アプリケーションでブロックおよびスクロール可能なカーソルで使用する必要がある関数とステートメントの属性をまとめたものです。 また、ODBC 3.x アプリケーションが ODBC 2.x ドライバーと互換性を保つために知っておくべき、この領域における ODBC 2.x と ODBC 3.x の間の変更点もリストします。

関数または

ステートメント属性
Comments
SQL_ATTR_FETCH_BOOKMARK_PTR SQLFetchScroll で使用するブックマークをポイントします。

アプリケーションが ODBC 2.x ドライバーでこれを設定する場合、これは固定長ブックマークを指す必要があります。
SQL_ATTR_ROW_STATUS_PTR SQLFetchSQLFetchScrollSQLBulkOperations、および SQLSetPos によって設定される行ステータス配列を指します。

アプリケーションが ODBC 2.x ドライバーでこれを設定し、SQLFetchScrollSQLFetch、または SQLExtendedFetch を呼び出す前に、SQL_ADD の Operation を指定して SQLBulkOperation を呼び出すと、SQLSTATE HY011 (属性は現在設定できません) が返されます。

アプリケーションが ODBC 2.x ドライバーで SQLFetch を呼び出すと、SQLFetchSQLExtendedFetch にマップされるため、この配列の値を返します。
SQL_ATTR_ROWS_FETCHED_PTR SQLFetch および SQLFetchScroll がフェッチされた行数を返すバッファーを指します。

アプリケーションが ODBC 2.x ドライバーで SQLFetch を呼び出すと、SQLFetchSQLExtendedFetch にマップされるため、このバッファーに値が返されます。
SQL_ATTR_ROW_ARRAY_SIZE 行セットのサイズを設定します。

アプリケーションが ODBC 2.x ドライバーで SQL_ADD の Operation を使用して SQLBulkOperations を呼び出す場合、呼び出しには SQL_ATTR_ROW_ARRAY_SIZE ではなく SQL_ROWSET_SIZE が使用されます。これは、呼び出しが SQL_ROWSET_SIZE を使用する SQL_ADD の Operation を使用して SQLSetPos にマップされるためです。

ODBC 2.x ドライバーで SQL_ADD または SQLExtendedFetchOperation を使用して SQLSetPos を呼び出すと、SQL_ROWSET_SIZE が使用されます。

ODBC 2.x ドライバーで SQLFetch または SQLFetchScroll を呼び出すと、SQL_ATTR_ROW_ARRAY_SIZE が使用されます。
SQLBulkOperations 挿入操作とブックマーク操作を実行します。 SQL_ADD の Operation を持つ SQLBulkOperations が ODBC 2.x ドライバーで呼び出されると、SQL_ADD の Operation を持つ SQLSetPos にマップされます。 実装の詳細を次に示します。

- ODBC 2.x ドライバーを使用する場合、アプリケーションは StatementHandle に関連付けられた暗黙的に割り当てられた ARD のみを使用する必要があります。 ODBC 2.x ドライバーでは明示的な記述子操作がサポートされていないため、行を追加するために別の ARD を割り当てることはできません。 アプリケーションは、SQLSetDescFieldSQLSetDescRec ではなく、SQLBindCol を使用して ARD にバインドする必要があります。
- ODBC 3.x ドライバーを呼び出す場合、アプリケーションは SQLFetch または SQLFetchScroll を呼び出す前に、SQL_ADD の Operation を使用して SQLBulkOperations を呼び出すことができます。 ODBC 2.x ドライバーを呼び出す場合、アプリケーションは SQL_ADD の操作で SQLBulkOperations を呼び出す前に SQLFetchScroll を呼び出す必要があります。
SQLFetch 次の行セットを返します。 実装の詳細を次に示します。

- アプリケーションが ODBC 2.x ドライバーで SQLFetch を呼び出すと、SQLExtendedFetch にマップされます。
- アプリケーションが ODBC 3.x ドライバーで SQLFetch を呼び出すと、SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性で指定された行数が返されます。
SQLFetchScroll 指定した行セットを返します。 実装の詳細を次に示します。

- アプリケーションが ODBC 2.x ドライバーで SQLFetchScroll を呼び出すと、単一行に適用される各エラーの前に SQLSTATE 01S01 (行のエラー) が返されます。 これが行われるのは、ODBC 3.x ドライバー マネージャーがこれを SQLExtendedFetch にマップし、SQLExtendedFetch がこの SQLSTATE を返すためです。 アプリケーションが ODBC 3.x ドライバーで SQLFetchScroll を呼び出した場合、SQLSTATE 01S01 (行のエラー) は返されません。
- アプリケーションが FetchOrientation を SQL_FETCH_BOOKMARK に設定して ODBC 2.x ドライバーで SQLFetchScroll を呼び出す場合、FetchOffset 引数を 0 に設定する必要があります。 ODBC 2.x ドライバーでオフセットベースのブックマークフェッチが試行された場合、SQLSTATE HYC00 (オプション機能は実装されていません) が返されます。

Note

ODBC 3.x アプリケーションでは、SQLExtendedFetch または SQL_ROWSET_SIZE ステートメント属性を使用しないでください。 代わりに、SQLFetchScroll と SQL_ATTR_ROW_ARRAY_SIZE ステートメント属性を使用する必要があります。 ODBC 3.x アプリケーションでは、SQL_ADD の OperationSQLSetPos を使用せず、SQL_ADD の OperationSQLBulkOperations を使用する必要があります。