Sdílet prostřednictvím


Transakce: Provádění transakcí v sadě záznamů (rozhraní ODBC)

Toto téma popisuje, jak provádět transakce v sadě záznamů.

Poznámka

Je podporována pouze jedna úroveň transakcí; transakce nemůžete vnořovat.

K provedení transakce v sadě záznamů

  1. Zavolejte členskou funkci BeginTrans objektu CDatabase.

  2. Nemáte-li naimplementováno hromadné načítání řádku, zavolejte členské funkce AddNew/Update, Edit/Update a Delete jednoho nebo více objektů sady záznamů ze stejné databáze tolikrát, kolikrát potřebujete. Pro více informací viz. Sada záznamů: Přidávání, aktualizování a odstranění záznamů (ODBC). Máte-li naimplementováno hromadné načítání řádku, musíte napsat své vlastní funkce pro aktualizaci zdroje dat.

  3. Nakonec zavolejte členskou funkci CommitTrans objektu CDatabase. Pokud dojde k chybě v jedné z aktualizací nebo se rozhodnete zrušit změny, zavolejte členskou funkci Rollback.

Následující příklad používá dvě sady záznamů k odstranění studentského zápisu z registrační databáze školy, odebrání studenta ze všech tříd, ve kterých je student zapsán. Protože volání Delete v obou sadách záznamů musí proběhnout úspěšně, je požadována transakce. Příklad předpokládá existenci členské proměnné m_dbStudentReg, typ CDatabase je již připojen ke zdroji dat a tříd sady záznamů CEnrollmentSet 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

Opětovné volání BeginTrans bez volání CommitTrans nebo Rollback je chybné.

Viz také

Odkaz

CDatabase Class

CRecordset Class

Koncepty

Transakce (rozhraní ODBC)

Transakce: Jak transakce ovlivňují aktualizace (rozhraní ODBC)