Transaktion: Ausführen einer Transaktion in einem Recordset (ODBC)
In diesem Thema wird erläutert, wie eine Transaktion in einem Recordset ausgeführt wird.
Hinweis
Es wird nur eine Ebene von Transaktionen unterstützt; Transaktionen können nicht geschachtelt werden.
So führen Sie eine Transaktion in einem Recordset aus
Rufen Sie die Memberfunktion des
CDatabase
BeginTrans
Objekts auf.Wenn Sie das Abrufen von Massenzeilen nicht implementiert haben, rufen Sie die
AddNew/Update
FunktionenEdit/Update
undDelete
Memberfunktionen eines oder mehrerer Recordset-Objekte derselben Datenbank so oft wie erforderlich auf. Weitere Informationen finden Sie unter "Recordset: Hinzufügen, Aktualisieren und Löschen von Datensätzen (ODBC)". Wenn Sie massenweises Abrufen von Zeilen implementiert haben, müssen Sie eigene Funktionen schreiben, um die Datenquelle zu aktualisieren.Rufen Sie schließlich die Memberfunktion des
CDatabase
CommitTrans
Objekts auf. Wenn in einer der Updates ein Fehler auftritt oder Sie beschließen, die Änderungen abzubrechen, rufen Sie dieRollback
Memberfunktion auf.
Im folgenden Beispiel werden zwei Recordsets verwendet, um die Registrierung eines Kursteilnehmers aus einer Datenbank für die Schulregistrierung zu löschen und den Kursteilnehmer aus allen Klassen zu entfernen, in denen der Kursteilnehmer registriert ist. Da die Delete
Aufrufe in beiden Recordsets erfolgreich sein müssen, ist eine Transaktion erforderlich. Im Beispiel wird davon ausgegangen, dass m_dbStudentReg
eine Membervariable vom Typ CDatabase
, die bereits mit der Datenquelle verbunden ist, sowie die Recordsetklassen CEnrollmentSet
und CStudentSet
. Die strStudentID
Variable enthält einen Wert, der vom Benutzer abgerufen wird.
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;
}
Hinweis
Wird BeginTrans
erneut ohne Aufruf aufgerufen CommitTrans
oder Rollback
ist ein Fehler aufgetreten.
Siehe auch
Transaktion (ODBC)
Transaktion: Wie Transaktionen sich auf Aktualisierungen auswirken (ODBC)
CDatabase-Klasse
CRecordset-Klasse