Partager via


TN068 : effectuer des transactions avec le pilote ODBC de Microsoft Access 7

[!REMARQUE]

La note technique suivante n'a pas été modifiée depuis si c'était première inclus dans la documentation en ligne.Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrects.Pour obtenir les informations les plus récentes, il est recommandé que vous trouviez la rubrique d'intérêt dans l'index de la documentation en ligne.

Cette remarque décrit comment exécuter des transactions en utilisant les classes de base de données ODBC MFC et le pilote ODBC de Microsoft Access 7,0 inclus dans le pilote de bureau de Microsoft ODBC pack la version 3,0.

Vue d'ensemble

Si votre application de base de données exécute les transactions, vous devez veiller à appeler CDatabase::BeginTrans et CRecordset::Open dans l'ordre approprié dans votre application.Le pilote Microsoft Access 7,0 utilise le moteur de base de données Microsoft Jet, et Jet nécessite que votre application pour ne pas démarrer une transaction sur n'importe quelle base de données qui a un curseur ouvert.Pour les classes de base de données ODBC MFC, un curseur ouvert équivaut à CRecordset un objet ouvert.

Si vous ouvrez un recordset avant d'appeler BeginTrans, vous ne pouvez pas afficher les messages d'erreur.Toutefois, tout recordset met à jour votre application est devenue permanent après avoir appelé CRecordset::Update, et les mises à jour ne seront pas restaurée en appelant Restauration.Pour éviter ce problème, vous devez appeler BeginTrans d'abord puis ouvrez le recordset.

MFC active les fonctionnalités du pilote pour la validation du curseur et le comportement d'annulation.La classe CDatabase fournit deux fonctions membres, GetCursorCommitBehavior et GetCursorRollbackBehavior, pour tester l'effet de toute transaction sur votre objet ouvert d' CRecordset .Pour le pilote ODBC de Microsoft Access 7,0, ces fonctions membres retournent SQL_CB_CLOSE car le pilote d'Accès ne prend pas en charge la conservation du curseur.Par conséquent, vous devez appeler CRecordset::Requery suivant une opération de CommitTrans ou de Restauration .

Lorsque vous devez exécuter plusieurs transactions l'un après l'autre, vous ne pouvez pas appeler Requery après la première transaction puis démarrer le suivant.Vous devez fermer le recordset avant l'appel suivant à BeginTrans pour répondre à la spécification throw.Cette note technique décrit deux méthodes de gérer cette situation :

  • Fermeture du recordset après chaque opération de CommitTrans ou de Restauration .

  • À l'aide de la fonction API ODBC SQLFreeStmt.

Fermeture du recordset après chaque opération de CommitTrans ou de restauration

Avant de démarrer la transaction, assurez -vous que l'objet recordset est fermé.Après avoir appelé BeginTrans, appelez la fonction membre de Ouvrir du recordset.Fermez le recordset immédiatement après l'appel CommitTrans ou Restauration.Notez que plusieurs fois à ouvrir et fermer le recordset peuvent ralentir les performances d'une application.

À l'aide de SQLFreeStmt

Vous pouvez également utiliser la fonction API ODBC SQLFreeStmt pour fermer explicitement le curseur après avoir terminé une transaction.Pour démarrer une autre transaction, l'appel BeginTrans suivi CRecordset::Requery.En appelant SQLFreeStmt, vous devez spécifier le HSTMT du recordset comme premier paramètre et le SQL_CLOSE comme deuxième paramètre.Cette méthode est plus rapide que la fermeture et les ouvrir le recordset au début de chaque transaction.Le code suivant montre comment implémenter cette technique :

CMyDatabase db;
db.Open( "MYDATASOURCE" );
CMyRecordset rs( &db );

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor
::SQLFreeStmt( rs.m_hstmt, SQL_CLOSE );

// start transaction 2
db.BeginTrans( );

// now get the result set
rs.Requery( );

// manipulate data

// end transaction 2
db.CommitTrans( );

rs.Close( );
db.Close( );

Une autre façon d'implémenter cette technique consiste à écrire une fonction, RequeryWithBeginTrans, que vous pouvez appeler pour démarrer la transaction suivante lorsque vous avez validé ou restaurer le premier.Pour écrire une telle fonction, effectuez les étapes suivantes :

  1. Copiez le code pour CRecordset::Requery( ) à la nouvelle fonction.

  2. Ajoutez la ligne suivante juste après l'appel à SQLFreeStmt:

    m_pDatabase->BeginTrans( );

Vous pouvez maintenant appeler cette fonction entre chaque paire de transactions :

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans( );

// manipulate data

// end transaction 2
db.CommitTrans( );  // or Rollback( )

[!REMARQUE]

n'utilisez pas cette technique si vous devez modifier les variables membres m_strFilter ou m_strSort de recordset entre les transactions.Dans ce cas, vous devez fermer le recordset après chaque opération de CommitTrans ou de Restauration .

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie