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
Appelez la fonction membre de l’objet
CDatabase
BeginTrans
.Si vous n’avez pas implémenté la récupération de lignes en bloc, appelez les
AddNew/Update
fonctions membresEdit/Update
Delete
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.Enfin, appelez la fonction membre de l’objet
CDatabase
CommitTrans
. Si une erreur se produit dans l’une des mises à jour ou si vous décidez d’annuler les modifications, appelez saRollback
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_dbStudentReg
variable 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