Comment faire : effectuer une transaction distribuée avec un fournisseur .NET en utilisant ServicedComponent dans Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 316627 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

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.

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, Windows 2000 Server, Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 ou SQL Server 2000

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 . Par exemple :
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  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/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Pour plus d'informations sur ce processus, consultez la rubrique suivante dans le Guide du développeur .NET Framework :
Transactions automatiques et les classes de .NET Framework
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

Créez le projet

  1. Procédez comme suit pour créer un nouveau projet Application console dans Visual Basic .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 Basic 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 Module1.vb comme DistributedTransaction.vb.
  2. Supprimer tout le code du fichier DistributedTransaction.vb.
  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. Ajoutez le code suivant dans le fichier DistributedTransaction.vb :
    Imports System
    Imports System.Data.SqlClient
    Imports System.EnterpriseServices
    Imports System.Runtime.CompilerServices
    Imports System.Reflection
    
    <Assembly: ApplicationName("DistributedTransaction")> 
    <Assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")> 
    
    
    Namespace DistributedTransaction
    
        '<summary>
        'Summary description for Class1.
        '</summary>
        Module Module1
            '<summary>
            'The main entry point for the application.
            '</summary>
            <STAThread()> Sub Main()
                Try
                    Dim myDistributedTran As New DistributedTran()
                    myDistributedTran.TestDistributedTransaction()
                Catch e As System.Data.SqlClient.SqlException
                    System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message)
                End Try
            End Sub
        End Module
    
        '<summary>
        'Summary description for TestApp.
        '</summary>
        <Transaction(TransactionOption.Required)> Public Class DistributedTran
            Inherits ServicedComponent
    
            Public Sub DistributedTran()
            End Sub
    
            <AutoComplete()> Public Function TestDistributedTransaction() As String
    
    
                'The following Insert statement goes to the first server.
                'This Insert statement does not produce any errors. 
                Dim insertCmdSql As String = "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. 
                Dim exceptionCausingCmdSQL As String = "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.
                Dim SqlConn1 As New SqlConnection("Server=Name_of_Server1;uid=User_Id;database=DatabaseName;pwd=Password")
                Dim SqlConn2 As New SqlConnection("Server=Name_of_Server2;uid=User_Id;database=DatabaseName;pwd=Password")
    
                Try
                    Dim insertCmd As New SqlCommand(insertCmdSql, SqlConn1)
                    Dim exceptionCausingCmd As New SqlCommand(exceptionCausingCmdSQL, SqlConn2)
    
                    'This command should run 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()
                    Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()
    
                    SqlConn1.Close()
                    SqlConn2.Close()
    
                    Console.WriteLine("Hello")
    
                Catch ex As System.Data.SqlClient.SqlException
    
                    '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" Then
                        SqlConn1.Close()
                    End If
    
                    If SqlConn2.State.ToString() = "Open" Then
                        SqlConn2.Close()
                    End If
    
                End Try
    
                Return "Success"
    
            End Function
    
        End Class
    End Namespace 
    					
  5. Dans le menu Fichier , cliquez sur Enregistrer tout .
  6. 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 .
  7. 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
  8. Créer votre application.
  9. 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]
    GO
    
    CREATE TABLE [dbo].[TestTransaction] (
    	[Col1] [int] NULL ,
    	[Col2] [varchar] (100) NULL 
    ) ON [PRIMARY]
    GO 
    					
  10. 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 ».
  11. 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.
  12. Recherchez le code suivant dans votre projet Visual Basic :
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    et remplacer l'instruction SQL par une requête valide qui n'entraîne pas la transaction à annuler. Par exemple :
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Appuyez sur F5 pour compiler et exécuter l'application à nouveau.
  14. Réexécutez la commande à partir de l'étape 11 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.

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 :
312902 Comment faire : créer un composant de service .NET dans Visual Basic .NET

Propriétés

Numéro d'article: 316627 - Dernière mise à jour: lundi 24 février 2014 - Version: 2.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft .NET Framework Service Pack 2
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
Mots-clés : 
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtfr
Traduction automatique
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: 316627
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com