Comment faire : effectuer une transaction distribuée avec un fournisseur .NET à l'aide de ServicedComponent dans Visual C# .NET

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 316247
Pour une version de Microsoft Visual Basic .NET de cet article, voir 316627.

Cet article fait référence à l'espaces de noms bibliothèque de classes Microsoft .NET Framework suivants :
  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

DE CETTE TÂCHE

Résumé
Cet article étape par étape explique comment effectuer une transaction distribuée en utilisant un fournisseur .NET avec la classe ServicedComponent . Bien que cet article utilise le fournisseur SqlClient .NET sur un serveur Microsoft SQL Server, vous pouvez également utiliser le fournisseur managé ODBC ou OLE DB .NET.

back to the top

Configuration requise

La liste suivante met en évidence le matériel recommandé, logiciel infrastructure réseau et service packs sont requis :
  • Microsoft Windows 2000 Professionnel, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 ou Microsoft SQL Server 2000
back to the top

Vue d'ensemble

Instances d'une classe .NET Framework peuvent participer une transaction automatique si vous préparez la classe pour ce faire. Chaque ressource qui accède à une instance de classe ou un objet incorpore dans la transaction. Par exemple, si un objet utilise ADO.NET pour publier money sur un compte dans une base de données, le Gestionnaire de ressources de la base de données détermine si l'objet s'exécute dans une transaction. Si l'objet doit exécutez dans une transaction, le Gestionnaire de ressources incorpore automatiquement la base de données dans la transaction.

Utilisez le processus suivant pour préparer une classe à participer à une transaction automatique :
  1. Appliquer la classe TransactionAttribute à votre classe pour spécifier le type transaction automatique qui demande le composant.

    Le type de transaction doit être membre de l'énumération TransactionOption .
  2. Dériver votre classe de la classe ServicedComponent . ServicedComponent est la classe de base de toutes les classes qui utilisent les services COM +.
  3. Signer l'assembly avec un nom fort pour vous assurer que l'assembly contient une paire de clés unique.
  4. Enregistrez l'assembly qui contient votre classe avec le catalogue COM +.

    Remarque : si le client qui appelle une instance de votre classe est géré par le common language runtime, l'enregistrement est effectué pour vous. Cette étape est nécessaire uniquement si un appelant non géré crée et appelle les instances de votre classe. Utiliser l'outil d'installation de services de .NET (Regsvcs.exe) pour inscrire manuellement l'assembly.
Pour plus d'informations signer un assembly avec un nom fort, consultez la rubrique suivante dans le Guide du développeur Microsoft .NET Framework :
Signature d'un assembly avec un nom fort
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
Pour plus d'informations sur ce processus, consultez la rubrique suivante dans le Guide du développeur Microsoft .NET Framework :
Transactions automatiques et les classes de .NET Framework
http://msdn.microsoft.com/en-us/library/ms123400.aspx
back to the top

Créez le projet

  1. Procédez comme suit pour créer un nouveau projet Application console dans Visual C# .NET
    1. Démarrez Visual Studio .NET.
    2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
    3. Dans la boîte de dialogue Nouveau projet , cliquez sur projets Visual C# sous types de projet , cliquez sur application console sous modèles et puis cliquez sur OK .
    4. Dans l'Explorateur de solutions, renommez le fichier Class1.cs en DistributedTransaction.cs.
  2. Supprimer tout le code du fichier DistributedTransaction.cs.
  3. Dans le menu projet , cliquez sur Ajouter une référence et puis ajoutez les références suivantes :
    • System.EnterpriseServices
    • System.Data.dll

  4. Dans le fichier AssemblyInfo.cs, transformez en commentaire les lignes de code suivantes :
    [assembly: AssemblyKeyFile("")][assembly: AssemblyKeyName("")]					
  5. Ajoutez le code suivant dans le fichier DistributedTransaction.cs :
    using System;using System.Data.SqlClient;using System.EnterpriseServices;using System.Runtime.CompilerServices;using System.Reflection;[assembly: ApplicationName("DistributedTransaction")][assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]namespace DistributedTransaction{   /// <summary>   /// Summary description for Class1.   /// </summary>   class Class1   {      /// <summary>      /// The main entry point for the application.      /// </summary>      [STAThread]      static void Main(string[] args)      {         try         {            DistributedTran myDistributedTran = new DistributedTran();            myDistributedTran.TestDistributedTransaction();         }         catch (System.Data.SqlClient.SqlException e)         {            System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);         }               }   }   /// <summary>   /// Summary description for TestApp.   /// </summary>   [Transaction(TransactionOption.Required)]   public class DistributedTran: ServicedComponent    {      public DistributedTran()      {      }      [AutoComplete]      public string TestDistributedTransaction()      {         // The following Insert statement goes to the first server.         // This Insert statement does not produce any errors.          String insertCmdSql = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')";         // The following Delete statement goes to the second server.         // Because the table does not exist, this code throws an exception.         String exceptionCausingCmdSQL = "Delete from NonExistentTable";                              // The following connection strings create instances of two SqlConnection objects         // to connect to two different SQL Server servers in your environment.         // Modify the connection strings as necessary for your environment.         SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");         SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");         try         {            SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);            SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);               // This command runs properly.            insertCmd.Connection.Open();            insertCmd.ExecuteNonQuery();            // This command results in an exception, which automatically rolls back            // the first command (the insertCmd command).            exceptionCausingCmd.Connection.Open();            int cmdResult = exceptionCausingCmd.ExecuteNonQuery();                        SqlConn1.Close();            SqlConn2.Close();            Console.WriteLine("Hello");                     }         catch (System.Data.SqlClient.SqlException ex)         {            // After you catch the exception in this function, throw it.             // The service component receives this exception and             // aborts the transaction. The service component then            // throws the same exception, and the calling function            // receives the error message.            Console.WriteLine (ex.Message);            throw (ex);         }         finally          {            // Close the connection.            if (SqlConn1.State.ToString() == "Open")               SqlConn1.Close();            if (SqlConn2.State.ToString() == "Open")               SqlConn2.Close();         }         return "Success";             }   }}					
  6. Dans le menu Fichier , cliquez sur Enregistrer tout .
  7. Cliquez sur Démarrer , pointez sur programmes , pointez sur Visual Studio .NET , pointez sur Outils de Visual Studio .NET et puis cliquez sur invite de commande Visual Studio .NET .
  8. Ouvrez le dossier qui contient votre projet et exécutez la commande suivante pour signer l'assembly avec un nom fort :
    SN-k DistributedTransaction.snk
  9. Créer votre application.
  10. Créez la table suivante dans le premier serveur SQL Server :
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table [dbo].[TestTransaction]GOCREATE TABLE [dbo].[TestTransaction] (	[Col1] [int] NULL ,	[Col2] [varchar] (100) NULL ) ON [PRIMARY]GO 					
  11. Exécuter votre application. Notez que vous recevez le message d'erreur suivant (qui est le comportement attendu) :
    Transaction abandonnée : Erreur renvoyée : nom d'objet non valide « NonExistentTable ».
  12. Ouvrez l'Analyseur de requêtes SQL Server, ajoutez le code suivant et puis appuyez sur F5 pour exécuter la requête :
    USE NORTHWIND;SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'						
    Remarque que la requête ne renvoie pas les lignes car la transaction a été annulée.
  13. Recherchez le code suivant dans votre projet Visual C#:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";						
    et remplacer l'instruction SQL par une requête valide qui n'entraîne pas la transaction à annuler. Par exemple :
    String exceptionCausingCmdSQL = "Select @@Identity from customers";					
  14. Appuyez sur F5 pour compiler et exécuter l'application à nouveau.
  15. Réexécutez la commande à partir de l'étape 12 dans Query Analyzer. Notez que la requête renvoie une ligne car la transaction a été en mesure d'effectuer avec succès.
Remarques :
  • Cet exemple montre comment n'effectue pas de gestion des erreurs.
  • SQL Server et Microsoft Distributed Transaction Coordinator (MS DTC) doivent exécuter sur tous les clients et serveurs.
back to the top
Références
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
306296 Comment faire : créer un composant de service .NET qui utilise des transactions dans Visual C# .NET

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 316247 - Dernière mise à jour : 09/04/2003 20:36:34 - Révision : 3.3

Microsoft ADO.NET 1.0, Microsoft ADO.NET 1.1, Microsoft Visual C# .NET 2002 Initiation, Microsoft Visual C# .NET 2003 Initiation, Microsoft Enterprise Services (included with the .NET Framework) 1.0, Microsoft Enterprise Services (included with the .NET Framework 1.1)

  • kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316247 KbMtfr
Commentaires