レコードセット: AddNew、Edit、Delete の動作のしくみ (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
このトピック AddNew では、 Edit クラスの、、およびメンバー関数がどのように機能するかについて説明 DeleteCRecordset します。 取り上げるトピックは次のとおりです。
Note
このトピックの内容は、バルク行フェッチが実装されていない CRecordset の派生オブジェクトを対象にしています。 バルク行フェッチを使用している場合は、「レコード セット: レコードを一括フェッチする (ODBC)」を参照してください。
補足として、レコードフィールド Exchange: rfxのしくみについて説明します。これは、更新操作における rfx の対応するロールを記述したものです。
レコードの追加
レコードセットに新しいレコードを追加するには、レコードセットの AddNew メンバー関数を呼び出し、新しいレコードのフィールドデータメンバーの値を設定し、 Update メンバー関数を呼び出してレコードをデータソースに書き込みます。
を呼び出すための前提条件として、 AddNew レコードセットが読み取り専用として開かれていない必要があります。 CanUpdateCanAppend メンバー関数とメンバー関数を使用すると、これらの条件を決定できます。
を呼び出すと、次のように AddNew なります。
編集バッファー内のレコードが格納されるため、操作が取り消された場合にその内容を復元できます。
フィールドデータメンバーにフラグが設定され、後で変更を検出できるようになります。 フィールドデータメンバーも clean (変更なし) とマークされ、Null に設定されます。
を呼び出した後 AddNew 、エディットバッファーは新しい空のレコードを表し、値を入力する準備ができています。 これを行うには、値をに割り当てて手動で設定します。 フィールドに実際のデータ値を指定する代わりに、を呼び出し SetFieldNull て値 Null を指定することもできます。
変更をコミットするには、を呼び出し Update ます。 Update新しいレコードに対してを呼び出すと、次のようになります。
Odbc ドライバーが odbc API 関数をサポートしている場合
::SQLSetPos、MFC は関数を使用してデータソースにレコードを追加します。 では::SQLSetPos、SQL ステートメントを構築および処理する必要がないため、MFC でレコードをより効率的に追加できます。::SQLSetPosを使用できない場合、MFC は次のことを行います。変更が検出されない場合、
Updateは何も行いません。0を返します。変更がある場合は、
UpdateSQLUpdateステートメントを構築します。 すべてのダーティフィールドデータメンバーによって表される列が、 INSERT ステートメントに一覧表示されます。 列を強制的に含めるには、 SetFieldDirty メンバー関数を呼び出します。SetFieldDirty( &m_dataMember, TRUE );Update—Updateステートメントが実行され、トランザクションが進行中でない限り、レコードがデータソースのテーブル (スナップショットでない場合はレコードセット) にコミットされる新しいレコードをコミットします。格納されているレコードは、エディットバッファーに復元されます。
AddNewAddNewステートメントが正常に実行されたかどうかに関係なく、呼び出し前の現在のレコードが最新のものになります。
ヒント
新しいレコードを完全に制御するには、次の方法を使用します。値を持つフィールドの値を設定し、そのフィールドへのポインターを指定してを呼び出すことにより、Null のままになるフィールドを明示的に設定します
SetFieldNull(既定値)。 フィールドがデータソースに書き込まれないようにするには、フィールドへのポインターを使用してを呼び出し、パラメーターを FALSE にして、SetFieldDirtyフィールドの値を変更しないようにします。 フィールドを Null にできるかどうかを判断するには、を呼び出しIsFieldNullableます。ヒント
レコードセットデータメンバーが値を変更したことを検出するために、MFC では、レコードセットに格納できる各データ型に適した PSEUDO_NULL 値が使用されます。 フィールドを PSEUDO_NULL 値に明示的に設定する必要があり、フィールドが既に Null とマークされている場合は、を呼び出す必要があります。この場合、
SetFieldNull最初のパラメーターのフィールドのアドレスと2番目のパラメーターの FALSE を渡します。
追加されたレコードの表示
レコードがレコードセットに表示されるのはいつですか。 追加されたレコードは、次の2つの点によって表示されることがあり、表示されないことがあります。
ドライバーが対応していること。
フレームワークで利用できること。
Odbc ドライバーが odbc API 関数をサポートしている場合 ::SQLSetPos 、MFC は関数を使用してレコードを追加します。 では ::SQLSetPos 、追加されたレコードは更新可能な MFC レコードセットから参照できます。 関数をサポートしていない場合は、追加されたレコードは表示されず、を呼び出して表示する必要があり Requery ます。 を使用する ::SQLSetPos ことも効率的です。
既存のレコードの編集
レコードセット内の既存のレコードを編集するには、レコードをスクロールし、レコードセットのメンバー関数 Edit を呼び出して、新しいレコードのフィールドデータメンバーの値を設定し、 Update メンバー関数を呼び出して変更されたレコードをデータソースに書き込みます。
を呼び出すための前提条件として Edit 、レコードセットは更新可能である必要があります。 CanUpdateIsDeleted メンバー関数とメンバー関数を使用すると、これらの条件を決定できます。 現在のレコードも削除されていない必要があり、レコードセット内のレコードが存在する必要があります (との両方が IsBOFIsEOF 0 を返します)。
を呼び出すと Edit 、エディットバッファー内のレコード (現在のレコード) が格納されます。 格納されているレコードの値は、フィールドが変更されたかどうかを検出するために後で使用されます。
を呼び出した後 Edit も、エディットバッファーは現在のレコードを表しますが、フィールドデータメンバーへの変更を受け入れる準備ができました。 レコードを変更するには、編集するフィールドデータメンバーの値を手動で設定します。 フィールドに実際のデータ値を指定する代わりに、を呼び出し SetFieldNull て値 Null を指定することもできます。 変更をコミットするには、を呼び出し Update ます。
ヒント
またはモードを終了するに AddNew は Edit 、パラメーター AFX_MOVE_REFRESH を指定してを呼び出し Move ます。 AddNew
を呼び出すための前提条件として、レコードセットを空にすることはできず、 Update 現在のレコードは削除されていない必要があります。 IsBOF、 IsEOF 、および IsDeleted はすべて0を返す必要があります。
Update編集されたレコードに対してを呼び出すと、次のようになります。
Odbc ドライバーが odbc API 関数をサポートしている場合
::SQLSetPos、MFC は関数を使用してデータソースのレコードを更新します。 では::SQLSetPos、ドライバーは編集バッファーとサーバー上の対応するレコードを比較し、2つのレコードが異なる場合は、サーバー上のレコードを更新します。 では::SQLSetPos、SQL ステートメントを構築および処理する必要がないため、MFC でレコードをより効率的に更新できます。- または -
::SQLSetPosを使用できない場合、MFC は次のことを行います。変更がない場合、
Updateは何も行いません。0を返します。変更がある場合は、
UpdateSQLUpdateステートメントを構築します。 UPDATEステートメントに示されている列は、変更されたフィールドデータメンバーに基づいています。Update変更をコミットする — と、Updateステートメントを実行し、 — レコードはデータソースで変更されますが、トランザクションが進行中の場合はコミットされません (トランザクションが更新にどのように影響するかについては、「 — 」を参照してください)。 ODBC では、レコードのコピーも変更されます。のプロセスとは異なり、このプロセスでは、
AddNewEdit格納されているレコードは復元されません。 編集されたレコードは、現在のレコードとしてそのまま残ります。
注意事項
を呼び出してレコードセットを更新する準備ができたら
Update、テーブルの主キーを構成するすべての列 (または、テーブルの一意のインデックスのすべての列、または行を一意に識別するのに十分な列) がレコードセットに含まれていることに注意してください。 場合によっては、フレームワークは、レコードセット内で選択されている列だけに基づいてテーブル内の更新するレコードを特定します。 必要なすべての列がないと、テーブル内の複数のレコードが更新される可能性があります。 この場合、を呼び出すと、フレームワークは例外をスローしUpdateます。ヒント
を呼び出した
AddNew後、またはを呼び出したEdit後にいずれかの関数を呼び出した後にを呼び出すとUpdate、保存されたレコードを使用して編集バッファーが更新され、進行中の新しいレコードまたは編集されたレコードが置き換えられます。 この動作により、またはを中止AddNewEditして新しいものを開始することができます。進行中のレコードが問題であると判断した場合は、単にEditまたはを呼び出しAddNewます。
レコードの削除
レコードセットからレコードを削除するには、レコードをスクロールし、レコードセットの Delete メンバー関数を呼び出します。 AddNewやとは異なり Edit 、では、との Delete 一致する呼び出しは必要ありません Update 。
を呼び出すための前提条件として Delete 、レコードセットは更新可能である必要があり、レコードに記録されている必要があります。 CanUpdate、、 IsBOFIsEOF 、およびの IsDeleted 各メンバー関数を使用すると、これらの条件を決定できます。
を呼び出すと、次のように Delete なります。
Odbc ドライバーが odbc API 関数をサポートしている場合
::SQLSetPos、MFC は関数を使用してデータソースのレコードを削除します。::SQLSetPosは、通常、SQL を使用するよりも効率的です。- または -
::SQLSetPosを使用できない場合、MFC は次のことを行います。編集バッファー内の現在のレコードは、およびとしてバックアップされません
AddNewEdit。Deleteは、レコードSQLDeleteステートメントを構築します。編集バッファー内の現在のレコードは、 および にとして格納
AddNewされませんEdit。Deleteは削除をコミット — しDeleteします。 レコードはデータ ソースで削除済みとしてマークされ、レコードがスナップショットの場合は ODBC でマークされます。削除されたレコードの値はレコードセットのフィールド データ メンバーに残っていますが、フィールド データ メンバーは Null とマークされ、レコードセットのメンバー関数は 0 以外の値
IsDeletedを返します。
Note
レコードを削除した後、別のレコードまでスクロールして、編集バッファーを新しいレコードのデータに変換する必要があります。 を再度呼び出したり、
Deleteを呼び出したりするとエラーになりますEdit。
更新操作で使用SQLステートメントの詳細については、「 」を参照SQL。
こちらもご覧ください
レコードセット (ODBC)
レコードセット: 更新プログラムの詳細 (ODBC)
レコード フィールド Exchange (RFX)