Transakce: Provádění transakcí v sadě záznamů (ODBC)
Toto téma vysvětluje, jak provést transakci v sadě záznamů.
Poznámka:
Podporuje se pouze jedna úroveň transakcí; transakce nelze vnořit.
Provedení transakce v sadě záznamů
Volání členské funkce objektu
CDatabase
BeginTrans
Pokud jste neimplementovali hromadné načítání řádků, volejte
AddNew/Update
funkce ,Edit/Update
aDelete
členské funkce jednoho nebo více objektů sady záznamů stejné databáze tolikrát, kolikrát je to potřeba. Další informace naleznete v tématu Sada záznamů: Přidávání, aktualizace a odstraňování záznamů (ODBC). Pokud jste implementovali hromadné načítání řádků, musíte napsat vlastní funkce pro aktualizaci zdroje dat.Nakonec zavolejte členskou funkci objektu
CDatabase
CommitTrans
. Pokud dojde k chybě v některé z aktualizací nebo se rozhodnete změny zrušit, zavolejte její členovouRollback
funkci.
Následující příklad používá k odstranění registrace studenta ze školní registrační databáze dvě sady záznamů a odebere studenta ze všech tříd, ve kterých je student zaregistrovaný. Vzhledem k tomu, že Delete
volání v obou sadách záznamů musí být úspěšná, je vyžadována transakce. Příklad předpokládá existenci m_dbStudentReg
, členské proměnné typu CDatabase
již připojena ke zdroji dat, a třídy CEnrollmentSet
sady záznamů a CStudentSet
. Proměnná strStudentID
obsahuje hodnotu získanou od uživatele.
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;
}
Poznámka:
Volání BeginTrans
znovu bez volání CommitTrans
nebo Rollback
je chyba.
Viz také
Transakce (ODBC)
Transakce: Vliv transakcí na aktualizace (ODBC)
CDatabase – třída
CRecordset – třída