Partager via


Transaction : exécution d'une transaction dans un recordset (ODBC)

Cette rubrique explique comment exécuter une transaction dans un recordset.

Notes

Un seul niveau des transactions est pris en charge ; vous ne pouvez pas imbriquer les transactions.

Pour exécuter une transaction dans un recordset

  1. Appelez la fonction membre BeginTrans de l'objet CDatabase.

  2. Si vous n'avez pas implémenté l'extraction de lignes en bloc, appelez aussi souvent que nécessaire les fonctions membres AddNew/Update, Edit/Update et Delete d'un ou de plusieurs objets recordset de la même base de données. Pour plus d'informations, consultez Recordset : ajout, modification et suppression d'enregistrements (ODBC). Si vous avez implémenté l'extraction de lignes en bloc, vous devez écrire vos propres fonctions pour mettre à jour la source de données.

  3. Enfin, appelez la fonction membre CommitTrans de l'objet CDatabase. Si une erreur se produit pendant l'une des mises à jour ou que vous décidiez d'annuler les modifications, appelez la fonction membre Rollback.

L'exemple plus bas utilise deux recordsets pour supprimer l'inscription d'un étudiant d'une base de données gérant les inscriptions d'une école. L'étudiant est ainsi retiré de tous les cours auxquels il était inscrit. Les appels Delete doivent réussir dans les deux recordsets, ce qui implique l'utilisation d'une transaction. Cet exemple suppose l'existence de m_dbStudentReg, variable membre de type CDatabase déjà connectée à la source de données, et des classes de recordsets CEnrollmentSet et CStudentSet. La variable strStudentID contient une valeur fournie par l'utilisateur.

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;

}

Notes

Le fait d'appeler une nouvelle fois BeginTrans sans appeler CommitTrans ou Rollback constitue une erreur.

Voir aussi

Référence

CDatabase, classe

CRecordset, classe

Concepts

Transaction (ODBC)

Transaction : répercussions des transactions sur les mises à jour (ODBC)