Partager via


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

Cette rubrique explique comment effectuer une transaction dans un jeu d’enregistrements.

Remarque

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

Pour effectuer une transaction dans un jeu d’enregistrements

  1. Appelez la fonction membre de l’objet CDatabaseBeginTrans .

  2. Si vous n’avez pas implémenté la récupération de lignes en bloc, appelez les AddNew/Updatefonctions membres Edit/UpdateDelete d’un ou plusieurs objets recordset de la même base de données autant de fois que nécessaire. Pour plus d’informations, consultez Recordset : Ajout, mise à jour et suppression d’enregistrements (ODBC) Si vous avez implémenté la récupération de lignes en bloc, vous devez écrire vos propres fonctions pour mettre à jour la source de données.

  3. Enfin, appelez la fonction membre de l’objet CDatabaseCommitTrans . Si une erreur se produit dans l’une des mises à jour ou si vous décidez d’annuler les modifications, appelez sa Rollback fonction membre.

L’exemple suivant utilise deux recordsets pour supprimer l’inscription d’un étudiant à partir d’une base de données d’inscription scolaire, en supprimant l’étudiant de toutes les classes dans lesquelles l’étudiant est inscrit. Étant donné que les Delete appels dans les deux jeux d’enregistrements doivent réussir, une transaction est requise. L’exemple suppose l’existence d’une m_dbStudentRegvariable membre de type CDatabase déjà connectée à la source de données, ainsi que les classes CEnrollmentSet de jeu d’enregistrements et CStudentSet. La strStudentID variable contient une valeur obtenue de 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;

}

Remarque

Appeler BeginTrans à nouveau sans appeler CommitTrans ou Rollback est une erreur.

Voir aussi

Transaction (ODBC)
Transaction : répercussions des transactions sur les mises à jour (ODBC)
CDatabase, classe
CRecordset, classe