Share via


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

  1. Rufen Sie die Memberfunktion des CDatabaseBeginTrans Objekts auf.

  2. Wenn Sie das Abrufen von Massenzeilen nicht implementiert haben, rufen Sie die AddNew/UpdateFunktionen Edit/Updateund Delete 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.

  3. Rufen Sie schließlich die Memberfunktion des CDatabaseCommitTrans Objekts auf. Wenn in einer der Updates ein Fehler auftritt oder Sie beschließen, die Änderungen abzubrechen, rufen Sie die Rollback 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_dbStudentRegeine 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