レコードセット: レコードの追加、更新、削除 (ODBC)
このトピックの内容は、MFC ODBC クラスに該当します。
Note
大量のレコードをより効率的に追加する方法もあります。 詳細については、「レコードセット: レコードを大量に追加する方法 (ODBC)」を参照してください。
Note
このトピックの内容は、バルク行フェッチが実装されていない CRecordset の派生オブジェクトを対象にしています。 バルク行フェッチを使用する場合は、「レコードセット: バルク行フェッチ (ODBC)」を参照してください。
更新できるスナップショットとダイナセットでは、レコードを追加、編集 (更新)、削除できます。 このトピックでは、次の内容について説明します。
更新が行われるしくみや更新結果が他のユーザーに及ぼす影響の詳細については、「レコードセット: レコード更新のしくみ (ODBC)」を参照してください。 通常は、レコードを追加、編集、または削除すると、すぐにレコードセットによってデータ ソースが更新されます。 また、一連の更新処理をトランザクションにまとめることもできます。 トランザクションを開始すると、そのトランザクションをコミットするまで、更新処理は終了しません。 したがって、更新をやり直すことができます。 トランザクションについては、「トランザクション (ODBC)」を参照してください。
レコードセットの更新方法と更新設定の関係を次の表に示します。
レコードセットの読み出し/更新用の選択肢
| Type | Read | レコードの編集 | レコードの削除 | 新規作成 (追加) |
|---|---|---|---|---|
| 読み取り専用 | Y | N | N | N |
| 追加のみ可能 (Append-only) | Y | N | N | Y |
| すべて更新可能 | Y | Y | Y | Y |
レコードセットの更新可能性を調べる方法
レコードセット オブジェクトは、データ ソースが更新可能であり、レコードセットが更新できるという設定で開かれている場合に更新できます。 また、使用する SQL ステートメント、ODBC ドライバーの機能、ODBC カーソル ライブラリがメモリ内にあるかどうかなどに応じて更新できるかどうかが決まります。 レコードセットかデータ ソースが読み取り専用のときは、更新できません。
レコードセットが更新可能かどうかを調べるには
レコードセット オブジェクトのメンバー関数 CanUpdate を呼び出します。
CanUpdateは、レコードセットが更新可能なときは 0 以外の値を返します。
既定では、レコードセットはすべて更新可能です (AddNew、Edit、Delete 操作をすべて実行できます)。 更新可能なレコードセットは、appendOnly オプションを指定して開くこともできます。 この方法で開いたレコードセットでは、AddNew を使用して新しいレコードを追加することだけができます。 既存のレコードを編集または削除することはできません。 CanAppend メンバー関数を呼び出して、レコードセットが追加のためだけに開かれているかどうかを確認できます。 レコードセットがすべて更新できる場合、または追加のためだけに開かれている場合は、CanAppend が 0 以外の値を返します。
次の例では、レコードセット オブジェクト CanUpdate に対して rsStudentSet を使用しています。
if( !rsStudentSet.Open( ) )
return FALSE;
if( !rsStudentSet.CanUpdate( ) )
{
AfxMessageBox( "Unable to update the Student recordset." );
return;
}
注意事項
Update を呼び出してレコードセットを更新する前に、テーブルの主キーを構成するすべての列 (または、テーブルで一意のインデックスを構成するすべての列) がレコードセットに含まれていることに注意してください。 場合によっては、フレームワークは、レコードセット内で選択されている列だけに基づいてテーブル内の更新するレコードを特定します。 選択されている列数が不足していると、テーブル内の複数のレコードが更新されることがあり、場合によっては、テーブルの参照整合性が損なわれます。 この場合は、Update を呼び出した結果として例外がスローされます。
レコードセットへのレコードの新規追加
メンバー関数 CanAppend が 0 以外の値を返したときは、レコードセットに新しいレコードを追加できます。
新しいレコードをレコードセットに追加するには
レコードセットがレコード追加可能レコードセットであることを確認します。
レコードセット オブジェクトのメンバー関数 AddNew を呼び出します。
AddNewは、レコードセットをエディット バッファーとして利用できるようにします。 すべてのフィールド データ メンバーは特殊な Null 値に設定され、未変更の印が付けられます。そのため、Update を呼び出すと、変更された値だけがデータ ソースに書き出されます。新しいレコードのフィールド データ メンバーの値を設定します。
フィールド データ メンバーに値を代入します。 代入しなかったフィールドはデータ ソースに書き出されません。
レコードセット オブジェクトの
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;
}
ヒント
AddNew または Edit の呼び出しを取り消すには、もう 1 回 AddNew または Edit を呼び出すか、AFX_MOVE_REFRESH パラメーターを指定して Move を呼び出します。 データ メンバーは前回の値にリセットされ、Edit モードまたは Add モードが継続します。
レコードセットの既存のレコードの編集
レコードセットの CanUpdate メンバー関数が 0 以外の値を返した場合は、既存のレコードを編集できます。
レコードセット内の既存のレコードを編集するには
レコードセットが更新可能であることを確認します。
更新するレコードに移動 (スクロール) します。
レコードセット オブジェクトの Edit メンバー関数を呼び出します。
Editは、レコードセットをエディット バッファーとして利用できるようにします。 すべてのフィールド データ メンバーに未変更の印が付けられます。 Update を呼び出すと、変更されたフィールド データ メンバーの値だけをデータ ソースに書き出します。新しいレコードのフィールド データ メンバーの値を設定します。
フィールド データ メンバーに値を代入します。 値を代入しなかったフィールドには変更前の値が残ります。
レコードセット オブジェクトの
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;
}
ヒント
AddNew または Edit の呼び出しを取り消すには、もう 1 回 AddNew または Edit を呼び出すか、AFX_MOVE_REFRESH パラメーターを指定して Move を呼び出します。 データ メンバーは前回の値にリセットされ、Edit モードまたは Add モードが継続します。
レコードセットのレコードの削除
レコードセットの CanUpdate メンバー関数が 0 以外の値を返した場合は、レコードを削除できます。
レコードを削除するには
レコードセットが更新可能であることを確認します。
更新するレコードに移動 (スクロール) します。
レコードセット オブジェクトの Delete メンバー関数を呼び出します。
Deleteは、すぐにレコードセット内とデータ ソース上のレコードに削除の印を付けます。AddNewとEditとは異なり、Deleteには対応するUpdateの呼び出しがありません。別のレコードに移動 (スクロール) します。
Note
レコードセット内を移動する場合、削除したレコードがスキップされないことがあります。 詳細については、IsDeleted メンバー関数に関するトピックを参照してください。
Delete 操作の例を次に示します。 ここでは、削除するレコードに既に移動しているものと想定しています。 DeleteDelete を呼び出した後は、新しいレコードに移動することが重要です。
rsStudent.Delete( );
rsStudent.MoveNext( );
AddNew、Edit、Delete の各メンバー関数の効果の詳細については、「レコードセット: レコード更新のしくみ (ODBC)」を参照してください。