異動:在一個資料錄集內執行異動 (ODBC)
本主題說明如何在記錄集中執行交易。
注意
僅支援一層交易;您無法巢狀交易。
若要在記錄集中執行交易
CDatabase
呼叫對象的BeginTrans
成員函式。如果您尚未實作大量數據列擷取,請視需要呼叫
AddNew/Update
相同資料庫的一或多個記錄集物件的、Edit/Update
和Delete
成員函式。 如需詳細資訊,請參閱 記錄集:新增、更新和刪除記錄 (ODBC) 。 如果您已實作大量數據列擷取,則必須撰寫自己的函式來更新數據源。最後,呼叫
CDatabase
對象的CommitTrans
成員函式。 如果在其中一個更新中發生錯誤,或您決定取消變更,請呼叫其Rollback
成員函式。
下列範例會使用兩個記錄集,從學校註冊資料庫刪除學生的註冊,從註冊學生的所有班級中移除學生。 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;
}
注意
在沒有呼叫 或 的情況下再次呼叫 BeginTrans
CommitTrans
, Rollback
則為錯誤。