レコードセット: レコード更新のしくみ (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
レコードセットでは、データ ソースからレコードを選択するほか、レコードを更新、削除、追加することもできます。 レコードセットを更新できるかどうかは、データ ソースが更新可能かどうか、レコードセット オブジェクトを生成したときの設定内容、および生成した SQL の内容の 3 点によって決定されます。
注意
CRecordset オブジェクトの SQL は、レコードセットを更新できるかどうかに影響します。 SQL が結合または GROUP BY 句を含んでいる場合は、MFC は更新可能性を FALSE に設定します。
注意
このトピックの内容は、バルク行フェッチが実装されていない CRecordset の派生オブジェクトを対象にしています。 バルク行フェッチを使用する場合は、「レコードセット : バルク行フェッチ (ODBC)」を参照してください。
このトピックでは、次の内容について説明します。
レコードセットを更新するために必要な操作とフレームワークの動作
レコードセットが編集バッファーとして機能するしくみと、ダイナセットとスナップショットの違い
「レコードセット : AddNew、Edit、Delete の動作のしくみ (ODBC)」では、レコードセットから見た各関数の動作について説明します。
「レコードセット : 更新処理の詳細 (ODBC)」では、レコードセットの更新に関して詳しく説明しています。内容は、トランザクションが更新に及ぼす影響、レコードセットを閉じたときまたはスクロールしたときの現在処理中の更新に及ぼす影響、自分の更新処理と他のユーザーによる更新処理の関係などです。
レコードセット更新に必要な操作
レコードセットを使ってレコードの追加、編集、削除を行うために必要な操作と、それに対するフレームワークの動作を次の表に示します。
必要な操作とフレームワークの動作
プログラマの役割 |
フレームワークの役割 |
---|---|
データ ソースが更新可能 (または追加可能) かどうかを確認します。 |
データ ソースの更新または追加の可能性を調べる CDatabase メンバー関数を提供します。 |
更新可能なレコードセットを開きます。 |
|
レコードセットが CRecordset 更新関数 (CanUpdate または CanAppend) の呼び出しで更新可能かどうかを調べます。 |
|
レコードセットのメンバー関数を呼び出してレコードの追加、編集、削除を行います。 |
レコードセット オブジェクトとデータ ソースとの間のデータ交換を管理します。 |
必要ならば、トランザクションで更新処理を制御します。 |
トランザクションを行うためのメンバー関数 CDatabase を提供します。 |
トランザクションの詳細については、「トランザクション (ODBC)」を参照してください。
エディット バッファー
レコードセットのフィールド データ メンバーは、全体でエディット バッファーを構成します。エディット バッファーには、現在のレコードの内容が保存されます。 レコードの更新処理では、このエディット バッファーを使って現在のレコードを操作します。
レコードを追加するときは、エディット バッファーを使って新しいレコードを作成します。 レコードの追加が終了すると、レコードを追加する前に現在のレコードであったレコードが再び現在のレコードになります。
レコードを更新 (編集) するときは、エディット バッファーを使ってレコードセットのフィールド データ メンバーに新しい値を設定します。 更新が終了すると、更新したレコードがそのまま現在のレコードになります。
AddNew または Edit を呼び出すと、後で復元できるように現在のレコードが待避されます。 Delete を呼び出すと、現在のレコードは待避されず、削除したことを示す印が付けられます。また、この場合は、別のレコードにスクロールする必要があります。
注意
レコードを削除する場合、エディット バッファーは使用されません。 現在のレコードを削除すると、レコードに削除したことを示す印が付けられます。別のレコードに移動 (スクロール) するまでは、レコードセットはどのレコードも示していません。
ダイナセットとスナップショット
ダイナセットでは、レコードをスクロールすると、レコードの内容が最新表示されます。 スナップショットは、静的なレコードの状態なので、Requery を呼び出さない限り再表示されません。 ダイナセットの全機能を利用するには、ODBC API 準拠レベルが合致した ODBC ドライバーを使う必要があります。 詳細については、「ODBC の基礎」と「ダイナセット」を参照してください。