Share via


トランザクション: レコードセットからのトランザクション実行 (ODBC)

このトピックでは、レコードセットでトランザクションを実行する方法について説明します。

Note

サポートされているトランザクションのレベルは 1 つのみです。トランザクションを入れ子にすることはできません。

レコードセットでトランザクションを実行するには

  1. CDatabase オブジェクトの BeginTrans メンバー関数を呼び出します。

  2. 一括行フェッチを実装していない場合は、必要に応じて何度でも、同じデータベースの 1 つ以上のレコードセット オブジェクトの AddNew/UpdateEdit/UpdateDelete のメンバー関数を呼び出します。 詳細については、「レコードセット: レコードの追加、更新、削除 (ODBC)」を参照してください。 一括行フェッチを実装している場合は、データ ソースを更新する独自の関数を記述する必要があります。

  3. 最後に、CDatabase オブジェクトの CommitTrans メンバー関数を呼び出します。 更新プログラムの 1 つでエラーが発生した場合、または変更を取り消す場合は、その Rollback メンバー関数を呼び出します。

次の例では、2 つのレコードセットを使用して、学校登録データベースから学生の登録を削除し、学生が登録されているすべてのクラスから学生を削除します。 両方のレコードセットで Delete の呼び出しが成功する必要があるため、トランザクションが必要です。 この例では、m_dbStudentReg、データ ソースに接続済みの CDatabase 型のメンバー変数、および CEnrollmentSetCStudentSet のレコードセット クラスが存在することを想定しています。 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

CommitTransRollback を呼び出さずに再度 BeginTrans を呼び出すとエラーが発生します。

関連項目

トランザクション (ODBC)
トランザクション: トランザクションが更新処理に与える影響 (ODBC)
CDatabase クラス
CRecordset クラス