Transaktion: Ausführen einer Transaktion in einem Recordset (ODBC)

In diesem Thema wird erläutert, wie Sie eine Transaktion in einem Recordset ausführen.

Tipp

Es wird nur eine einzige Transaktionsebene unterstützt. Sie können Transaktionen nicht schachteln.

So führen Sie eine Transaktion in einem Recordset aus

  1. Rufen Sie die BeginTrans-Memberfunktion des CDatabase-Objekts auf.

  2. Falls Sie das gesammelte Abrufen von Zeilen nicht implementiert haben, rufen Sie so oft wie erforderlich die Memberfunktionen AddNew/Update, Edit/Update und Delete eines oder mehrerer Recordset-Objekte derselben Datenbank auf. Weitere Informationen finden Sie unter Recordset: Hinzufügen, Aktualisieren und Löschen von Datensätzen (ODBC). Falls Sie das gesammelte Abrufen von Zeilen implementiert haben, müssen Sie eigene Funktionen zur Aktualisierung der Datenquelle erstellen.

  3. Rufen Sie abschließend die CommitTrans-Memberfunktion des CDatabase-Objekts auf. Wenn bei einer Aktualisierung ein Fehler auftritt oder die Änderungen abgebrochen werden sollen, rufen Sie die zugehörige Rollback-Memberfunktion auf.

Im folgenden Beispiel wird mithilfe von zwei Recordsets die Einschreibung eines Studenten in die Registrierdatenbank der Schule gelöscht. So wird der Student aus allen Kursen gelöscht, in denen er eingetragen war. Da die Delete-Aufrufe in beiden Recordsets erfolgreich durchgeführt werden müssen, wird eine Transaktion benötigt. Das Beispiel setzt das Vorhandensein von m_dbStudentReg voraus, einer Membervariablen vom Typ CDatabase, die bereits mit der Datenquelle verbunden ist, sowie der Recordset-Klassen CEnrollmentSet und CStudentSet. Die strStudentID-Variable enthält einen Wert, der vom Benutzer eingegeben wurde.

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;

}

Tipp

Das erneute Aufrufen von BeginTrans ohne CommitTrans oder Rollback aufzurufen stellt einen Fehler dar.

Siehe auch

Referenz

CDatabase Class

CRecordset Class

Konzepte

Transaktion (ODBC)

Transaktion: Auswirkungen von Transaktionen auf Aktualisierungen (ODBC)