ダイナセット
このトピックでは、ダイナセットおよびダイナセットを使うための必要条件について説明します。
注意
このトピックの内容は、CRecordset などの MFC ODBC クラスに該当します。DAO クラスのダイナセットについては、CDaoRecordset クラスに関するトピックを参照してください。DAO では、ダイナセット型のレコードセットを開くことができます。
ダイナセットは、動的なプロパティを持つレコードセットです。 ダイナセット モードのレコードセット オブジェクト (普通は単に "ダイナセット" と呼ばれます) は、最終的に解放されるまでの間、次のような形でデータ ソースと一致した内容を保持します。 マルチユーザー環境では、自分のダイナセット内のレコードが、他のユーザーによって編集または削除されることがあります。また、自分のダイナセットが表すテーブルに、他のユーザーがレコードを追加することもあります。 アプリケーションでレコードセットに追加または削除したレコードは、直接ダイナセットに反映されます。 ほかのユーザーによってテーブルに追加されたレコードは、Requery メンバー関数を呼び出してダイナセットをビルドし直さない限り、ダイナセットには反映されません。 ほかのユーザーが削除したレコードは、"削除された" 印が付けられ、レコードセットの "穴" のようになります。 ほかのユーザーがレコードを編集した結果は、そのレコードにスクロールすると反映されます。
自分自身がダイナセットに変更を加えた場合も、同じように、ほかのユーザーの使っているダイナセットにすぐに反映されます。 また、自分自身が追加したレコードは、再クエリが行われるまでほかのユーザーのダイナセットには反映されません。 削除したレコードについては、"削除された" 印が付けられます。 同じデータベースに複数の接続がある (CDatabase オブジェクトが複数存在する) 場合は、それぞれの接続に対応するレコードセットはほかのユーザーのレコードセットと同じように扱われます。
ダイナセットは、飛行機の座席予約システムなどのように、データが動的に変化する場合に特に役立ちます。
注意
ダイナセットを使用するには、ダイナセットに対応したデータ ソース用の ODBC ドライバーが必要です。また、ODBC カーソル ライブラリは読み込まないでください。この詳細については、「ダイナセットを使うための必要条件」を参照してください。
レコードセットをダイナセットにするには、レコードセット オブジェクトの Open メンバー関数の最初のパラメーターに CRecordset::dynaset を指定します。
注意
更新可能なダイナセットを使用するには、ODBC ドライバーで、位置指定更新ステートメントまたは ::SQLSetPos ODBC API 関数がサポートされている必要があります。両方がサポートされている場合、MFC では、効率を考慮して ::SQLSetPos を使います。
ダイナセットを使うための必要条件
MFC データベース クラスでダイナセットをサポートするには、以下の条件を満たす必要があります。
ODBC カーソル ライブラリ DLL がデータ ソース用に使われていないこと。
カーソル ライブラリが使われていると、ダイナセットのサポートに必要な ODBC ドライバーの機能の一部が利用できなくなってしまいます。 したがって、ダイナセットを使うときは、CDatabase オブジェクトの作成時にカーソル ライブラリが読み込まれないようにします (使用している ODBC ドライバーが、以下で説明する要件を満たしている必要があります)。 詳細については、「ODBC の基礎」、および CDatabase クラスの CDatabase::OpenEx メンバー関数または CDatabase::Open メンバー関数に関するトピックを参照してください。
ODBC の用語では、ダイナセットとスナップショットのことをカーソルと呼びます。 カーソルは、レコードセット内の位置を追跡するためのしくみです。
データ ソースの ODBC ドライバーがキーセット ドリブン カーソルをサポートしていること。
キーセット ドリブン カーソルは、キーの集合を読み書きすることによって、テーブル内のデータを管理します。 ユーザーが特定のレコードにスクロールすると、テーブルからデータを得るためにキーを使います。 ドライバーがこの機能をサポートしているかどうかを調べるには、ODBC API 関数 ::SQLGetInfo をパラメーター SQL_SCROLL_OPTIONS で呼び出します。
キーセットのサポートなしでダイナセットを開こうとすると、CDBException 例外が発生し、戻り値として AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED が返されます。
データ ソースの ODBC ドライバーが、拡張フェッチをサポートしていること。
拡張フェッチは、SQL クエリ結果のレコードを前後にスクロールできる機能です。 使用しているドライバーがこの機能をサポートしているかどうかを調べるには、ODBC API 関数 ::SQLGetFunctions をパラメーター SQL_API_SQLEXTENDEDFETCH で呼び出します。
更新可能なダイナセットまたはスナップショットを使う場合は、ODBC ドライバーが ::SQLSetPos ODBC API 関数または位置指定更新のどちらかをサポートしている必要があります。 ::SQLSetPos 関数を使うと、SQL ステートメントを送出しなくても MFC 側でデータ ソースを更新できます。 この機能がサポートされている場合、MFC は、SQL ではなくこの関数を使って更新を処理します。 使用している ODBC ドライバーが ::SQLSetPos 関数をサポートしているかどうかを調べるには、::SQLGetInfo 関数をパラメーター SQL_POS_OPERATIONS で呼び出します。
データ ソースのテーブル内の特定の行を識別 <する (フォームの WHERE CURRENT OF の cursorname>) の位置指定更新では、SQL 構文。 使用しているドライバーがこの機能をサポートしているかどうかを調べるには、ODBC API 関数 ::SQLGetInfo をパラメーター SQL_POSITIONED_STATEMENTS で呼び出します。
通常、MFC ダイナセット (前方スクロール専用レコードセットを除く) を使うには、ODBC ドライバーがレベル 2 API に対応している必要があります。 データ ソースのドライバーがレベル 1 API に対応している場合でも、更新可能スナップショット、書き込み禁止スナップショット、および前方スクロール専用レコードセットは使えますが、ダイナセットは使えません。 ただし、レベル 1 ドライバーでも、拡張フェッチとキーセット ドリブン カーソルをサポートしている場合は、ダイナセットを使えます。 ODBC の準拠レベルの詳細については、「ODBC の基礎」を参照してください。
注意
スナップショットとダイナセットの両方を同時に使うには、2 つの異なる CDatabase オブジェクトを用意する必要があります (個別に接続します)。
ODBC カーソル ライブラリが管理する中間的な記憶領域を使うスナップショットとは異なり、ダイナセットでは、あるレコードにスクロールすると、すぐにその内容がデータ ソースから直接フェッチされます。 したがって、ダイナセットによって選択されたレコードは、常にデータ ソースと一致しています。
Visual C++ のこのバージョンに含まれている ODBC ドライバー一覧、および他のドライバーを取得する方法については、「ODBC ドライバーの一覧」を参照してください。