共用方式為


異動:在一個資料錄集內執行異動 (ODBC)

本主題說明如何在記錄集中執行交易。

注意

僅支援一層交易;您無法巢狀交易。

若要在記錄集中執行交易

  1. CDatabase呼叫物件的 BeginTrans 成員函式。

  2. 如果您尚未實作大量資料列擷取,請視需要呼叫 AddNew/Update 相同資料庫的一或多個記錄集物件的 、 Edit/UpdateDelete 成員函式。 如需詳細資訊,請參閱 記錄集:新增、更新和刪除記錄 (ODBC) 。 如果您已實作大量資料列擷取,則必須撰寫自己的函式來更新資料來源。

  3. 最後,呼叫 CDatabase 物件的 CommitTrans 成員函式。 如果在其中一個更新中發生錯誤,或您決定取消變更,請呼叫其 Rollback 成員函式。

下列範例會使用兩個記錄集,從學校註冊資料庫刪除學生的註冊,從註冊學生的所有班級中移除學生。 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;

}

注意

在沒有呼叫 或 的情況下再次呼叫 BeginTransCommitTransRollback 則為錯誤。

另請參閱

異動 (ODBC)
異動:異動如何影響更新 (ODBC)
CDatabase 類別
CRecordset 類別