異動:在一個資料錄集內執行異動 (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
則為錯誤。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應