トランザクション: レコードセットからのトランザクション実行 (ODBC)
このトピックでは、レコードセットでトランザクションを実行する方法について説明します。
Note
サポートされているトランザクションのレベルは 1 つのみです。トランザクションを入れ子にすることはできません。
レコードセットでトランザクションを実行するには
CDatabase
オブジェクトのBeginTrans
メンバー関数を呼び出します。一括行フェッチを実装していない場合は、必要に応じて何度でも、同じデータベースの 1 つ以上のレコードセット オブジェクトの
AddNew/Update
、Edit/Update
、Delete
のメンバー関数を呼び出します。 詳細については、「レコードセット: レコードの追加、更新、削除 (ODBC)」を参照してください。 一括行フェッチを実装している場合は、データ ソースを更新する独自の関数を記述する必要があります。最後に、
CDatabase
オブジェクトのCommitTrans
メンバー関数を呼び出します。 更新プログラムの 1 つでエラーが発生した場合、または変更を取り消す場合は、そのRollback
メンバー関数を呼び出します。
次の例では、2 つのレコードセットを使用して、学校登録データベースから学生の登録を削除し、学生が登録されているすべてのクラスから学生を削除します。 両方のレコードセットで Delete
の呼び出しが成功する必要があるため、トランザクションが必要です。 この例では、m_dbStudentReg
、データ ソースに接続済みの CDatabase
型のメンバー変数、および CEnrollmentSet
と CStudentSet
のレコードセット クラスが存在することを想定しています。 strStudentID
変数には、ユーザーから取得した値が含まれます。
BOOL CEnrollDoc::RemoveStudent( CString strStudentID )
{
// remove student from all the classes
// the student is enrolled in
if ( !m_dbStudentReg.BeginTrans( ) )
return FALSE;
CEnrollmentSet rsEnrollmentSet(&m_dbStudentReg);
rsEnrollmentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsEnrollmentSet.Open(CRecordset::dynaset) )
return FALSE;
CStudentSet rsStudentSet(&m_dbStudentReg);
rsStudentSet.m_strFilter = "StudentID = " + strStudentID;
if ( !rsStudentSet.Open(CRecordset::dynaset) )
return FALSE;
TRY
{
while ( !rsEnrollmentSet.IsEOF( ) )
{
rsEnrollmentSet.Delete( );
rsEnrollmentSet.MoveNext( );
}
// delete the student record
rsStudentSet.Delete( );
m_dbStudentReg.CommitTrans( );
}
CATCH_ALL(e)
{
m_dbStudentReg.Rollback( );
return FALSE;
}
END_CATCH_ALL
rsEnrollmentSet.Close( );
rsStudentSet.Close( );
return TRUE;
}
Note
CommitTrans
と Rollback
を呼び出さずに再度 BeginTrans
を呼び出すとエラーが発生します。
関連項目
トランザクション (ODBC)
トランザクション: トランザクションが更新処理に与える影響 (ODBC)
CDatabase クラス
CRecordset クラス