Cette note décrit comment effectuer des transactions lorsque vous utilisez les classes de base de données MFC ODBC et le pilote ODBC de Microsoft Access 7.0 inclus dans la version de Microsoft ODBC Desktop Driver Pack 3.0.
Vue d'ensemble
Si votre application de base de données effectue les transactions, vous devez être prudent d'appeler CDatabase::BeginTrans et CRecordset::Open dans l'ordre correct dans votre application. Le pilote Microsoft Access 7.0 utilise le moteur de base de données Microsoft Jet et Jet requiert que votre application ne commencer une transaction sur une base de données qui a un curseur ouvert. Pour les classes de base de données ODBC MFC, un curseur ouvert ce qui équivaut à un objet CRecordset ouvert.
Si vous ouvrez un objet recordset avant d'appeler BeginTrans, vous ne pouvez pas voir les messages d'erreur. Cependant, les mises à jour du jeu d'enregistrements que votre application fait devenir permanente après l'appel de CRecordset::Updateet les mises à jour ne seront pas être restaurée en appelant Rollback. Pour éviter ce problème, vous devez appeler BeginTrans d'abord et ensuite ouvrir l'objet recordset.
MFC vérifie la fonctionnalité de pilote pour le comportement du curseur commit et rollback. Classe CDatabase fournit deux fonctions membres, GetCursorCommitBehavior et GetCursorRollbackBehavior, afin de déterminer l'effet de toute opération sur l'objet CRecordset ouvert. Pour le pilote ODBC de Microsoft Access 7.0, ces fonctions membres retournent SQL_CB_CLOSE parce que le pilote Access ne supporte pas la préservation du curseur. Par conséquent, vous devez appeler CRecordset::Requery suite à une opération CommitTrans ou Rollback.
Lorsque vous avez besoin effectuer des transactions multiples l'un après l'autre, vous ne peut pas appeler Requery après la première transaction et puis démarrez suivant. Vous devez fermer le jeu d'enregistrements avant le prochain appel à BeginTrans afin de satisfaire l'exigence du Jet. Cette note technique décrit deux méthodes pour gérer cette situation:
Fermeture de l'objet Recordset après chaque CommitTrans ou opération
Avant de commencer une transaction, assurez-vous que l'objet recordset est fermé. Après avoir appelé BeginTrans, appeler à la fonction membre Open du jeu d'enregistrements. Immédiatement après avoir appelé CommitTrans ou Rollback, fermer le jeu d'enregistrements. Notez qu'à plusieurs reprises d'ouverture et fermeture du jeu d'enregistrements peuvent ralentir les performances d'une application.
À l'aide de SQLFreeStmt
Vous pouvez également utiliser la fonction API ODBC SQLFreeStmt explicitement fermer le curseur après la fin d'une transaction. Pour commencer une autre transaction, appelez BeginTrans suivie CRecordset::Requery. Quand appeler SQLFreeStmt, vous devez spécifier HSTMT du jeu d'enregistrements comme le premier paramètre et SQL_CLOSE comme deuxième paramètre. Cette méthode est plus rapide que la fermeture et l'ouverture du jeu d'enregistrements au début de chaque transaction. Le code suivant montre comment implémenter cette technique
CMyDatabase db ;
DB.Ouvrir (« MYD&ATASOURCE ») ;
CMyRecordset rs (amp ; db) ;
/ / démarrer la transaction 1 et / / ouvrir l'objet recordset
DB.BeginTrans () ;
RS.Ouvert () ;
/ / manipuler les données
/ / fin de transaction 1
DB.CommitTrans () ; et / ou Rollback)
/ / fermer le curseur
:: SQLFreeStmt (SQL_CLOSE, rs.m_hstmt) ;
/ / start transaction 2
DB.BeginTrans () ;
/ / get maintenant le jeu de résultats
RS.Actualiser () ;
/ / manipuler les données
/ / fin de transaction 2
DB.CommitTrans () ;
RS.Étroite () ;
DB.Étroite)
Une autre façon de mettre en œuvre cette technique consiste à écrire une nouvelle fonction, RequeryWithBeginTrans, que vous pouvez appeler pour démarrer la transaction après que vous engager ou rollback premier suivante. Pour écrire une telle fonction, faire les étapes suivantes:
m_pDatabase-gt;BeginTrans( );
Maintenant vous pouvez appeler cette fonction entre chaque paire de transactions:
/ / démarrer la tra&nsaction 1 et / / ouvrir l'objet recordset
DB.BeginTrans () ;
RS.Ouvert () ;
/ / manipuler les données
/ / fin de transaction 1
DB.CommitTrans (); nbsp ; et / ou Rollback)
/ / fermer le curseur, démarrer de nouvelles transactions,
/ / et obtenir le jeu de résultats
RS.RequeryWithBeginTrans () ;
/ / manipuler les données
/ / fin de transaction 2
DB.CommitTrans () ; et / ou Rollback)
&Notenbsp ; Ne pas utiliser cette technique si vous avez besoin modifier le jeu d'enregistrements membre variables m_strFilter ou m_strSort entre les transactions. Dans ce cas, vous devez fermer le recordset après chaque opération CommitTrans ou Rollback.
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie