Udostępnij za pośrednictwem


Transakcja: Wykonywanie transakcji w zestawie rekordów (ODBC)

W tym temacie opisano sposób przeprowadzenia transakcji w zestawie rekordów.

[!UWAGA]

Obsługiwany jest tylko jeden poziom transakcji; nie można zagnieździć transakcji.

Do wykonania transakcji w zestawie rekordów

  1. Wywołanie CDatabase obiektu BeginTrans funkcji składowej.

  2. Jeśli nie wprowadziły pobieranie wiersza luzem, wywołanie AddNew/Aktualizuj, Edytuj/Aktualizuj, i usunąć funkcji elementów członkowskich obiektów recordset, tej samej bazy danych jako liczbę razy.Aby uzyskać więcej informacji, zobacz zestaw rekordów: Dodawanie, aktualizowanie i usuwanie rekordów (ODBC).Jeśli zaimplementowano wiersz luzem, pobieranie, należy napisać własne funkcje aktualizacji źródła danych.

  3. Wreszcie, call CDatabase obiektu CommitTrans funkcji składowej.Jeśli wystąpi błąd w jednej aktualizacji lub zdecydować anulować zmiany, należy wywołać jej wycofywania funkcji składowej.

Poniższy przykład wykorzystuje dwa zestawy rekordów usunąć rejestrowania studenta z bazy danych rejestracji szkoły, usuwanie student z wszystkich klas, w których trwa rejestracja student.Ponieważ usunąć wywołania w oba zestawy musi zakończyć się sukcesem, wymagana jest transakcja.W przykładzie zakłada się istnienie m_dbStudentReg, zmienną typu CDatabase już podłączony do źródła danych i klas rekordów CEnrollmentSet i CStudentSet.strStudentID Zmienna zawiera wartość otrzymanych od użytkownika.

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;

}

[!UWAGA]

Wywołanie BeginTrans ponownie bez wywołania CommitTrans lub wycofywania , występuje błąd.

Zobacz też

Informacje

Klasa CDatabase

Klasa CRecordset

Koncepcje

Transakcja (ODBC)

Transakcja: Jak transakcje dotyczą aktualizacji (ODBC)