Comment faire pour utiliser transactions COM + dans un composant Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 315707 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape explique comment utiliser COM + (Component Services) transactions dans une classe Visual Basic .NET. Un ensemble d'opérations de base de données est considérée comme une unité. Les opérations soit tout réussisse ou, si une opération échoue, la transaction de toute échoue. Dans ce dernier cas, les opérations de base de données qui ont été tentées ne sont pas validées dans la base de données sous-jacente.

Configuration requise

Les éléments suivants décrivent le matériel recommandé, les logiciels, infrastructure réseau, compétences et connaissances, service packs :
  • Microsoft Windows 2000 Server exécutant le Service Pack 1
  • Microsoft Internet Information Services (IIS) version 4.0 ou ultérieure
  • Microsoft Internet Explorer version 5.0, 5.5 ou 6.0
Connaissance préalable requise :
  • Connaissance de concepts transactionnelles et traitement
  • Maîtrise de COM + (Services de composants)

Services de transactions COM +

L'espace de noms System.EnterpriseServices dans Microsoft .NET framework fournit les fonctionnalités à implémenter le traitement des transactions. Pour accéder à COM + services transactionnelles, créer une classe en procédant comme suit :
  1. Ouvrez Visual Studio .NET.
  2. Créez un nouveau projet de bibliothèque de classe nommé prjEnterprise dans Visual Basic .NET. Visual Basic .NET crée une classe publique nommée Class1.
  3. Ajoutez une référence au projet à la bibliothèque de System.EnterpriseServices. Dans la fenêtre Explorateur de solutions, cliquez avec le bouton droit sur le dossier références , puis sélectionnez Ajouter une référence dans le menu contextuel. Sous l'onglet .NET , faites défiler jusqu'à ce que vous repériez System.EnterpriseServices . Double-cliquez sur System.EnterpriseServices , assurez-vous que System.EnterpriseServices apparaît dans la fenêtre Sélection des composants et puis cliquez sur OK .
  4. Utiliser l'instruction Imports pour l'espace de noms System.EntpriseServices et l'espace de noms System.Data.SqlClient , afin que vous ne devrez pas entièrement qualifier les références à ces espaces de noms plus loin dans votre code. Ces instructions doivent apparaître antérieures à toutes les autres instructions dans votre fichier de classe :
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Pour pouvoir utiliser les services COM + transactionnel, votre classe nommée clsES, doit hériter fonctionnalité de ServicedComponent :
    	Public Class clsES
    Inherits ServicedComponent
  6. Un attribut de transaction est utilisé pour spécifier le niveau de prise en charge transactionnelle de la classe :
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Créer une méthode de clsES appelé dbAccess qui reçoit les quatre paramètres entiers entrée. Les deux premiers paramètres fournissent un ID de produit et les unités sur commande pour ce produit. Les deuxième deux paramètres fournissent un ID de produit et le nombre d'unités en stock de ce produit. Cette méthode effectue un ensemble d'opérations de base de données par rapport à ces ID de produit spécifié qui doivent être traités comme une transaction :
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. Dans la méthode dbAccess , créer un objet de connexion SQL pour les Comptoirs de base de données et ouvrez la connexion. Opérations de base de données prendront place en utilisant cette base de données :
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Définir un bloc try pour capturer tout traitement de la base de données qui peut-être se produire. Ces erreurs doivent être interceptées afin de pouvoir annuler la transaction. Le bloc try inclut deux opérations de base de données, chacun d'eux mise à jour un champ différent d'un enregistrement de table produits spécifié.
    		Try
  10. Effectuer la mise à jour premier de la table Produits. Le champ UnitsonOrder mis à jour avec la valeur D'onOrder de produit avec l'ID, comme indiqué dans les deux premiers paramètres d'entrée. Un SQLcommand sert à exécuter cette mise à jour SQL :
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. Effectuer une autre mise à jour à la table Produits. Le champ UnitsinStock mis à jour avec la valeur D'inStock de produit avec l'ID, comme indiqué dans les paramètres d'entrée troisième et quatrième. Un SQLCommand sert à exécuter cette mise à jour SQL :
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. Car ces mises à jour font partie d'une transaction COM +, ils sont validés en tant qu'unité. La méthode setComplete de la classe contextUtil de l'espace de noms System.EnterpriseServices est utilisée pour valider la transaction--dans ce cas les deux mises à jour, si aucune erreur n'a été levée :
          ContextUtil.SetComplete()
  13. La connexion à la base de données Les Comptoirs est fermée :
          Conn.Close()
  14. Les erreurs qui surviennent lors de l'exécution les commandes SQL doivent être interceptées, afin que la transaction entière peut être annulée :
    	   Catch e As Exception
  15. La méthode setAbort de la classe contextUtil de l'espace de noms System.EnterpriseServices est utilisée pour annuler la transaction entière. Si la première mise à jour réussit et que la deuxième mise à jour échoue, aucune mise à jour est validé dans la table Produits. L'exception interceptée est levée à l'appelant, indiquant que la transaction a échoué :
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. Pour ce composant fonctionner correctement, le composant doit avoir un nom fort. Procédez comme suit pour générer un nom fort et pour signer l'assembly avec le nom fort :

    1. Pour ouvrir une invite de commande Visual Studio .NET, cliquez sur Démarrer , cliquez sur programmes , cliquez sur Visual Studio .NET , puis cliquez sur Outils de Visual Studio .NET .
    2. À l'invite de commandes, tapez sn.exe-k snEnterprise.snk pour donner à votre assembly un nom fort.

      Pour plus d'informations sur la signature des assemblys avec noms forts, reportez-vous à la documentation du Kit de développement .NET Framework SDK.
    3. Copiez snEnterprise.snk dans le dossier de projet.
    4. Dans AssemblyInfo.vb, ajoutez la ligne suivante de code avant ou après les autres instructions attribut assembly :
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Enregistrer et créer un projet.

Terminer la liste de code

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

Vérifier qu'il fonctionne

Pour tester ce code, créer une application console qui utilise clsES. Dans un cas, une transaction réussit et le onorder et instock champs pour le produit spécifié sont mis à jour. Dans le second cas, la mise à jour pour le champ onOrder pour un produit spécifié réussit, mais la mise à jour pour L'inStock champ pour un produit échoue, car le numéro de produit spécifiée n'existe pas dans la table Produits. Il en résulte une défaillance de transaction, avec la transaction est ignorée.
  1. Ajouter une nouvelle application console nommée testES à votre solution, afin que la solution contient à la fois le projet testES et le projet prjEnterprise. Pour ajouter le nouveau projet, cliquez sur Nouveau dans le menu Fichier , puis sélectionnez le projet .
  2. Une boîte de dialogue Nouveau projet s'affiche. Sélectionnez le dossier de Visual Basic dans le projet volet types et application de console puis à sélectionner à partir des modèles. Dans la zone Nom dans le volet Modèles, tapez testES , qui est le nom du projet. Assurez-vous que le bouton Ajouter à la solution , qui s'affiche en bas de la boîte de dialogue, est activé. Cliquez sur OK pour ajouter ce projet à la solution.
  3. Afin que testES tester clsES, vous devez ajouter une référence. Dans la fenêtre de solutions, cliquez avec le bouton droit sur le dossier références qui se trouve sous le testES projet qui vous venez d'ajouter. Sélectionnez Ajouter la référence . Une boîte de dialogue Ajouter une référence s'affiche.
  4. Sélectionnez l'onglet projets et double-cliquez sur prjEnterprise . Une référence doit apparaître dans composants sélectionnés , qui se trouve dans la partie inférieure de la boîte de dialogue. Cliquez sur OK pour ajouter cette référence à ce projet.
  5. Cliquez avec le bouton droit sur l'application de console, testES , puis sélectionnez par démarrage Project .
  6. Dans le menu débogage , sélectionnez Windows . Dans le sous-menu, sélectionnez Exécution . Cela garantit que la fenêtre Exécution est visible.
  7. Copiez le test code suivant dans le module Module1, remplacez les instructions de Sub Main et End Sub. Le module doit apparaître comme suit :
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. Appuyez sur F5 pour exécuter le code de test.
  9. Dans le code dans l'étape 7, le premier appel dbAccess réussit. Un produit 1 et un produit 2 sont en la table Produits. Le champ onOrder de produit 1 est mis à jour à 777 et le inStock champ de produit 2 est mis à jour 888. Étant donné que cette transaction a réussi, la fenêtre Exécution doit affiche le message opération « transactions ONE - réussie ».

    L'appel de deuxième dbAccess échoue. Par conséquent, ni une mise à jour instructions dans dbAccess pour les produits de table est validée dans la base de données. Bien que produit 1 peut avoir son champ onOrder mis à jour pour 5, produit 2 ne peut pas avoir ses inStock champ défini sur-20. En raison d'une contrainte définie au sein de la définition de table produit, inStock n'est pas autorisée à avoir des nombres négatifs.

    Par conséquent, cet appel dbAccess échoue, ce qui entraîne l'échec de toute transaction. La table Produits reste telle qu'elle était définie avant l'appel de dbAccess. L'instruction catch gère la notification de l'échec de transaction de dbAccess, ce qui entraîne le message « transactions FAILURE » est affiché dans la fenêtre Exécution.
Examinez le contenu de la table produits de Northwind à l'aide de la SQL Server Enterprise Manager. Lorsque vous affichez produit 1, le champ onOrder est la somme pour 777 ; pour le produit 2, le instock champ est 888. Par conséquent, le deuxième appel à dbAccess qui aurait provoqué différentes valeurs pour ces champs, a a échoué.

Résolution des problèmes

  • Assurez-vous que tout projet qui utilise les services COM + possède un nom fort.
  • Toute classe qui utilise les services COM + doit hériter du composant de service qui se trouve dans l'espace de noms System.EnterpriseServices .
  • Pendant le débogage, une transaction peut expirent avant est validée ou annulée. Pour éviter un délai d'attente, utilisez une propriété de délai d'attente sur l'attribut de transaction. Dans le cas qui suit, la méthode associée obtient 1 200 secondes pour compléter toutes les transactions avant son expiration :
    < Transaction(TransactionOption.Required, timeout:=1200) >

Références

Pour plus d'informations, reportez-vous aux sites Microsoft Developer réseau MSDN (Web adresses suivantes :
Intégration de COM +: comment .NET Enterprise Services peuvent vous aident à créer applications distribuées
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Composants de service
http://msdn.microsoft.com/en-us/library/aa289839.aspx

Propriétés

Numéro d'article: 315707 - Dernière mise à jour: mardi 8 novembre 2005 - Version: 3.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
Mots-clés : 
kbmt kbhowtomaster KB315707 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: 315707
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