ダイナセット
このトピックでは、ダイナセットについて説明し、その使用可否について説明します。
Note
このトピックは、CRecordset を含む MFC ODBC クラスに適用されます。 DAO クラスのダイナセットの詳細については、「CDaoRecordset」を参照してください。 DAO を使うと、ダイナセット型のレコードセットを開くことができます。
ダイナセットは、動的なプロパティを持つレコードセットです。 その有効期間中、ダイナセット モードのレコードセット オブジェクト (通常はダイナセットと呼ばれます) は、次のようにデータ ソースと同期した状態が維持されます。 マルチユーザー環境では、他のユーザーがダイナセット内のレコードを編集または削除する場合や、ダイナセットが表すテーブルにレコードを追加する場合があります。 アプリケーションによってレコードセットに追加された、またはレコードセットから削除されたレコードは、ダイナセットに反映されます。 他のユーザーがテーブルに追加したレコードは、その Requery メンバー関数を呼び出してダイナセットをリビルドするまで、ダイナセットに反映されません。 他のユーザーがレコードを削除すると、MFC コードはレコードセット内のその削除をスキップします。 既存のレコードに対する他のユーザーの編集変更は、影響を受けるレコードにスクロールするとすぐにダイナセットに反映されます。
同様に、ダイナセット内のレコードに編集を加えると、他のユーザーが使用中のダイナセットに反映されます。 追加したレコードは、他のユーザーがダイナセットを再クエリするまで、ダイナセットに反映されません。 削除したレコードは、他のユーザーのレコードセットで "削除済み" とマークされます。 同じデータベースへの接続が複数ある場合 (複数の CDatabase オブジェクト)、それらの接続に関連付けられたレコードセットは、他のユーザーのレコードセットと同じ状態になります。
ダイナセットは、航空会社の予約システムのように、データを動的にする必要がある場合に最も役立ちます。
Note
ダイナセットを使うには、ダイナセットをサポートするデータ ソースの ODBC ドライバーが必要です。ODBC カーソル ライブラリは読み込まないでください。 詳細については、「ダイナセットの使用可否」を参照してください。
レコードセットがダイナセットであることを指定するには、レコードセット オブジェクトの Open メンバー関数の 1 つ目のパラメーターとして CRecordset::dynaset を渡します。
Note
更新可能なダイナセットの場合、ODBC ドライバーは、位置指定更新ステートメントまたは ::SQLSetPos ODBC API 関数のいずれかをサポートしている必要があります。 両方がサポートされている場合、MFC は効率を向上させるために ::SQLSetPos を使用します。
ダイナセットの使用可否
MFC データベース クラスは、次の要件を満たす場合にダイナセットをサポートします。
ODBC カーソル ライブラリ DLL をこのデータ ソースに使うことはできません。
カーソル ライブラリを使うと、ダイナセットのサポートに必要な基になる ODBC ドライバーの一部の機能がマスクされます。 ダイナセットを使う場合 (そして、このセクションの残りの部分で説明するように、ダイナセットに必要な機能が ODBC ドライバーがある場合)、
CDatabaseオブジェクトを作成するときに、MFC にカーソル ライブラリを読み込まないようにすることができます。 詳細については、ODBC と、クラスCDatabaseの OpenEx または Open メンバー関数に関するページを参照してください。ODBC の用語では、ダイナセットとスナップショットはカーソルと呼ばれます。 カーソルは、レコードセット内のその位置を追跡するために使用されるメカニズムです。
データ ソースの ODBC ドライバーは、キーセット ドリブン カーソルをサポートする必要があります。
キーセット ドリブン カーソルは、キーのセットを取得して格納することで、テーブルのデータを管理します。 キーは、ユーザーが特定のレコードにスクロールしたときに、テーブルから現在のデータを取得するために使われます。 ドライバーがこのサポートを提供しているかどうかを判断するには、SQL_SCROLL_OPTIONS パラメーターを指定して
::SQLGetInfoODBC API 関数を呼び出します。キーセットをサポートせずにダイナセットを開こうとすると、戻りコード値が AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED の
CDBExceptionを受け取ります。データ ソースの ODBC ドライバーは、拡張フェッチをサポートしている必要があります。
拡張フェッチは、SQL クエリの結果レコードを前方だけでなく後方にもスクロールする機能です。 ドライバーがこの機能をサポートしているかどうかを判断するには、SQL_ API_SQLEXTENDEDFETCH パラメーターを指定して
::SQLGetFunctionsODBC API 関数を呼び出します。
更新可能なダイナセット (または、スナップショット) を使う場合、ODBC ドライバーは ::SQLSetPos ODBC API 関数または位置指定更新のいずれかをサポートする必要があります。 ::SQLSetPos 関数を使うと、SQL ステートメントを送信することなく、MFC でデータ ソースを更新できます。 このサポートを利用できる場合、MFC では、更新に SQL を使うよりもこれを優先します。 ドライバーが ::SQLSetPos をサポートしているかどうかを判断するには、SQL_POS_OPERATIONS パラメーターを指定して ::SQLGetInfo を呼び出します。
位置指定更新では、SQL 構文 (WHERE CURRENT OF<cursorname> という形式) を使って、データ ソース上のテーブルの特定の行を識別します。 ドライバーが位置指定更新をサポートしているかどうかを判断するには、SQL_POSITIONED_STATEMENTS パラメーターを指定して ::SQLGetInfo を呼び出します。
一般に、MFC のダイナセット (前方スクロール専用レコードセットを除く) には、レベル 2 の API に準拠した ODBC ドライバーが必要です。 データ ソースのドライバーがレベル 1 の API セットに準拠している場合でも、更新可能スナップショット、読み取り専用スナップショットの両方、および前方スクロール専用レコードセットを使用できますが、ダイナセットは使用できません。 ただし、拡張フェッチとキーセットドリブン カーソルがサポートされている場合は、レベル 1 のドライバーでダイナセットがサポートされることがあります。 ODBC 準拠レベルの詳細については、ODBC に関するページを参照してください。
Note
スナップショットとダイナセットの両方を使用する必要がある場合は、2 つの異なる CDatabase オブジェクト (2 つの異なる接続) をベースとする必要があります。
ODBC カーソル ライブラリによって維持される中間ストレージを使うスナップショットとは異なり、ダイナセットの場合、スクロールするとすぐにデータ ソースからレコードが直接フェッチされます。 そのため、ダイナセットによって元々選択されていたレコードは、データ ソースと同期された状態が維持されます。
Visual C++ のこのバージョンに含まれている ODBC ドライバー一覧、および他のドライバーを取得する方法については、「ODBC ドライバーの一覧」を参照してください。