次の方法で共有


レコードセット : レコードの追加、更新、削除 (ODBC)

更新 : 2007 年 11 月

このトピックの内容は、MFC ODBC クラスに該当します。

z5139kz6.alert_note(ja-jp,VS.90).gifメモ :

大量のレコードをより効率的に追加する方法もあります。詳細については、「レコードセット : レコードを大量に追加する方法 (ODBC)」を参照してください。

z5139kz6.alert_note(ja-jp,VS.90).gifメモ :

このトピックの内容は、バルク行フェッチが実装されていない CRecordset の派生オブジェクトを対象にしています。バルク行フェッチを使用する場合は、「レコードセット : バルク行フェッチ (ODBC)」を参照してください。

更新できるスナップショットとダイナセットでは、レコードを追加、編集 (更新)、削除できます。このトピックでは、次の内容について説明します。

  • レコードセットが更新可能かどうかを調べる方法

  • 新しいレコードを追加する方法

  • 既存のレコードを編集する方法

  • レコードを削除する方法

更新が行われるしくみや更新結果が他のユーザーに及ぼす影響の詳細については、「レコードセット : レコード更新のしくみ (ODBC)」を参照してください。通常は、レコードを追加、編集、または削除すると、すぐにレコードセットによってデータ ソースが更新されます。また、一連の更新処理をトランザクションにまとめることもできます。トランザクションを開始すると、そのトランザクションをコミットするまで、更新処理は終了しません。したがって、更新をやり直すことができます。トランザクションについては、「トランザクション (ODBC)」を参照してください。

レコードセットの更新方法と更新設定の関係を次の表に示します。

レコードセットの読み出し/更新用の選択肢

種類

読み取り

レコードの編集

レコードの削除

新規作成 (追加)

読み取り専用 (Read-only)

N

N

不可

追加のみ可能 (Append-only)

N

N

すべて更新可能

レコードセットの更新可能性を調べる方法

レコードセット オブジェクトは、データ ソースが更新可能であり、レコードセットが更新できるという設定で開かれている場合に更新できます。また、使用する SQL ステートメント、ODBC ドライバの機能、ODBC カーソル ライブラリがメモリ内にあるかどうかなどに応じて更新できるかどうかが決まります。レコードセットかデータ ソースが読み取り専用のときは、更新できません。

レコードセットが更新可能かどうかを調べるには

  • レコードセット オブジェクトのメンバ関数 CanUpdate を呼び出します。

    CanUpdate は、レコードセットが更新可能なときは 0 以外の値を返します。

既定では、レコードセットはすべて更新可能です (AddNewEditDelete をすべて使用できます)。更新可能なレコードセットは、appendOnly オプションを指定して開くこともできます。この方法で開いたレコードセットでは、AddNew を使用して新しいレコードを追加することだけができます。既存のレコードを編集または削除することはできません。CanAppend メンバ関数を呼び出して、レコードセットが追加のためだけに開かれているかどうかを確認できます。レコードセットがすべて更新できる場合、または追加のためだけに開かれている場合は、CanAppend が 0 以外の値を返します。

次の例では、レコードセット オブジェクト rsStudentSet に対して CanUpdate を使用しています。

if( !rsStudentSet.Open( ) )
    return FALSE;
if( !rsStudentSet.CanUpdate( ) )
{
    AfxMessageBox( "Unable to update the Student recordset." );
    return;
}
z5139kz6.alert_caution(ja-jp,VS.90).gif注意 :

Update を呼び出してレコードセットを更新する前に、テーブルの主キーを構成するすべての列 (または、テーブルで一意のインデックスを構成するすべての列) がレコードセットに含まれていることに注意してください。場合によっては、フレームワークは、レコードセット内で選択されている列だけに基づいてテーブル内の更新するレコードを特定します。選択されている列数が不足していると、テーブル内の複数のレコードが更新されることがあり、場合によっては、テーブルの参照整合性が損なわれます。この場合は、Update を呼び出した結果として例外がスローされます。

レコードセットへのレコードの新規追加

メンバ関数 CanAppend が 0 以外の値を返したときは、レコードセットに新しいレコードを追加できます。

新しいレコードをレコードセットに追加するには

  1. レコードセットがレコード追加可能レコードセットであることを確認します。

  2. レコードセット オブジェクトのメンバ関数 AddNew を呼び出します。

    AddNew は、レコードセットをエディット バッファとして利用できるようにします。すべてのフィールド データ メンバは特殊な Null 値に設定され、未変更の印が付けられます。そのため、Update を呼び出すと、変更された値だけがデータ ソースに書き出されます。

  3. 新しいレコードのフィールド データ メンバの値を設定します。

    フィールド データ メンバに値を代入します。代入しなかったフィールドはデータ ソースに書き出されません。

  4. レコードセット オブジェクトのメンバ関数 Update を呼び出します。

    Update は、新しいレコードをデータ ソースに実際に書き出します。Update の呼び出しに失敗したときの処理方法については、「レコードセット : レコード更新のしくみ (ODBC)」を参照してください。

レコードを追加するしくみ、および追加したレコードがレコードセット内に表示される時期については、「レコードセット : AddNew、Edit、Delete の動作のしくみ (ODBC)」を参照してください。

次に、新しいレコードを追加する例を示します。

if( !rsStudent.Open( ) )
    return FALSE;
if( !rsStudent.CanAppend( ) )
    return FALSE;                      // no field values were set
rsStudent.AddNew( );
rsStudent.m_strName = strName;
rsStudent.m_strCity = strCity;
rsStudent.m_strStreet = strStreet;
if( !rsStudent.Update( ) )
{
    AfxMessageBox( "Record not added; no field values were set." );
    return FALSE;
}
z5139kz6.alert_note(ja-jp,VS.90).gifヒント :

AddNew または Edit の呼び出しを取り消すには、もう 1 回 AddNew または Edit を呼び出すか、AFX_MOVE_REFRESH パラメータを指定して Move を呼び出します。データ メンバは前回の値にリセットされ、Edit モードまたは Add モードが継続します。

レコードセットの既存のレコードの編集

メンバ関数 CanUpdate が 0 以外の値を返したときは、レコードセットの既存のレコードを編集できます。

レコードセット内の既存のレコードを編集するには

  1. レコードセットが更新可能であることを確認します。

  2. 更新するレコードに移動 (スクロール) します。

  3. レコードセット オブジェクトのメンバ関数 Edit を呼び出します。

    Edit は、レコードセットをエディット バッファとして利用できるようにします。すべてのフィールド データ メンバに未変更の印が付けられます。Update を呼び出すと、変更されたフィールド データ メンバの値だけをデータ ソースに書き出します。

  4. 新しいレコードのフィールド データ メンバの値を設定します。

    フィールド データ メンバに値を代入します。値を代入しなかったフィールドには変更前の値が残ります。

  5. レコードセット オブジェクトのメンバ関数 Update を呼び出します。

    Update は、変更されたレコードをデータ ソースに実際に書き出します。Update の呼び出しに失敗したときの処理方法については、「レコードセット : レコード更新のしくみ (ODBC)」を参照してください。

編集終了後は、編集されたレコードが現在のレコードになります。

次に、Edit 処理の例を示します。ここでは、編集するレコードに既に移動しているものと想定しています。

rsStudent.Edit( );
rsStudent.m_strStreet = strNewStreet;
rsStudent.m_strCity = strNewCity;
rsStudent.m_strState = strNewState;
rsStudent.m_strPostalCode = strNewPostalCode;
if( !rsStudent.Update( ) )
{
    AfxMessageBox( "Record not updated; no field values were set." );
    return FALSE;
}
z5139kz6.alert_note(ja-jp,VS.90).gifヒント :

AddNew または Edit の呼び出しを取り消すには、もう 1 回 AddNew または Edit を呼び出すか、AFX_MOVE_REFRESH パラメータを指定して Move を呼び出します。データ メンバは前回の値にリセットされ、Edit モードまたは Add モードが継続します。

レコードセットのレコードの削除

メンバ関数 CanUpdate が 0 以外の値を返したときは、レコードセットのレコードを削除できます。

レコードを削除するには

  1. レコードセットが更新可能であることを確認します。

  2. 更新するレコードに移動 (スクロール) します。

  3. レコードセット オブジェクトのメンバ関数 Delete を呼び出します。

    Delete は、すぐにレコードセット内とデータ ソース上のレコードに削除の印を付けます。

    AddNew および Edit とは異なり、Delete には Update 呼び出しはありません。

  4. 別のレコードに移動 (スクロール) します。

    z5139kz6.alert_note(ja-jp,VS.90).gifメモ :

    レコードセット内を移動する場合、削除したレコードがスキップされないことがあります。詳細については、IsDeleted メンバ関数に関するトピックを参照してください。

次に、Delete 処理の例を示します。ここでは、削除するレコードに既に移動しているものと想定しています。Delete の呼び出し終了後は、必ず別のレコードに移動してください。

rsStudent.Delete( );
rsStudent.MoveNext( );

AddNewEdit、および Delete の各メンバ関数の動作の詳細については、「レコードセット : レコード更新のしくみ (ODBC)」を参照してください。

参照

概念

レコードセット (ODBC)

レコードセット : レコードのロック (ODBC)