レコードセット: 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 は次のことを行います。

    1. 変更が検出されない場合、 Update は何も行いません。0を返します。

    2. 変更がある場合は、 Update SQL Updateステートメントを構築します。 すべてのダーティフィールドデータメンバーによって表される列が、 INSERT ステートメントに一覧表示されます。 列を強制的に含めるには、 SetFieldDirty メンバー関数を呼び出します。

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. UpdateUpdateステートメントが実行され、トランザクションが進行中でない限り、レコードがデータソースのテーブル (スナップショットでない場合はレコードセット) にコミットされる新しいレコードをコミットします。

    4. 格納されているレコードは、エディットバッファーに復元されます。 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 ます。

ヒント

またはモードを終了するに AddNewEdit 、パラメーター AFX_MOVE_REFRESH を指定してを呼び出し Move ます。 AddNew

を呼び出すための前提条件として、レコードセットを空にすることはできず、 Update 現在のレコードは削除されていない必要があります。 IsBOFIsEOF 、および IsDeleted はすべて0を返す必要があります。

Update編集されたレコードに対してを呼び出すと、次のようになります。

  • Odbc ドライバーが odbc API 関数をサポートしている場合 ::SQLSetPos 、MFC は関数を使用してデータソースのレコードを更新します。 では ::SQLSetPos 、ドライバーは編集バッファーとサーバー上の対応するレコードを比較し、2つのレコードが異なる場合は、サーバー上のレコードを更新します。 では ::SQLSetPos 、SQL ステートメントを構築および処理する必要がないため、MFC でレコードをより効率的に更新できます。

    - または -

  • ::SQLSetPosを使用できない場合、MFC は次のことを行います。

    1. 変更がない場合、 Update は何も行いません。0を返します。

    2. 変更がある場合は、 Update SQL Updateステートメントを構築します。 UPDATEステートメントに示されている列は、変更されたフィールドデータメンバーに基づいています。

    3. Update 変更をコミットする — と、 Update ステートメントを実行し、 — レコードはデータソースで変更されますが、トランザクションが進行中の場合はコミットされません (トランザクションが更新にどのように影響するかについては、「 — 」を参照してください)。 ODBC では、レコードのコピーも変更されます。

    4. のプロセスとは異なり、このプロセスでは、 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 は次のことを行います。

    1. 編集バッファー内の現在のレコードは、およびとしてバックアップされません AddNewEdit

    2. Deleteは、レコードSQLDeleteステートメントを構築します。

      編集バッファー内の現在のレコードは、 および にとして格納 AddNew されません Edit

    3. Delete は削除をコミット — し Delete します。 レコードはデータ ソースで削除済みとしてマークされ、レコードがスナップショットの場合は ODBC でマークされます。

    4. 削除されたレコードの値はレコードセットのフィールド データ メンバーに残っていますが、フィールド データ メンバーは Null とマークされ、レコードセットのメンバー関数は 0 以外の値 IsDeleted を返します。

    Note

    レコードを削除した後、別のレコードまでスクロールして、編集バッファーを新しいレコードのデータに変換する必要があります。 を再度呼び出したり、 Delete を呼び出したりするとエラーになります Edit

更新操作で使用SQLステートメントの詳細については、「 」を参照SQL。

こちらもご覧ください

レコードセット (ODBC)
レコードセット: 更新プログラムの詳細 (ODBC)
レコード フィールド Exchange (RFX)