Sdílet prostřednictvím


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ů

  1. Volání členské funkce objektu CDatabase BeginTrans

  2. Pokud jste neimplementovali hromadné načítání řádků, volejte AddNew/Updatefunkce , Edit/Updatea Delete č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.

  3. 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í členovou Rollback 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