Comment faire pour utiliser transactions COM + dans un composant Visual C#

Traductions disponibles Traductions disponibles
Numéro d'article: 816141 - 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 + (Services de composants) des transactions dans une classe Visual C#. Un ensemble d'opérations de base de données est considérée comme une unité. Toutes les opérations réussissent soit, si une opération échoue, la transaction complète échoue. Dans ce dernier cas, les opérations de base de données qui ont été essayé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 dont vous avez besoin :
  • Microsoft Windows 2000 Server SP1
  • Microsoft Internet Information Services (IIS) version 4.0 ou ultérieure
  • Microsoft Internet Explorer versions 5.0, 5.5 ou 6.0
Cet article suppose que vous êtes familiarisé avec les opérations suivantes :
  • Concepts transactionnelles et traitement
  • COM + (Services de composants)

Les services COM + transactions

Vous pouvez implémenter traitement des transactions avec l'espace de noms System.EnterpriseServices dans le Microsoft .NET Framework. Pour accéder COM + services transactionnelles, créer une classe. Pour ce faire, procédez comme suit :
  1. Démarrez Visual Studio .NET ou Visual Studio 2005.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Cliquez sur projets Visual C# sous types de projet , puis cliquez sur bibliothèque de classes sous modèles . Nommez le projet prjEnterprise .

    note Dans Visual Studio 2005, cliquez sur Visual C# sous types de projet , puis cliquez sur bibliothèque de classes sous modèles . Nommez le projet prjEnterprise .
  4. Par défaut, Class1 est créé.
  5. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence .
  6. La boîte de dialogue Ajouter une référence s'affiche. Sous nom de composant sous l'onglet .NET , double-cliquez sur System.EnterpriseServices .
  7. Assurez-vous que System.EnterpriseServices apparaît sous composants sélectionnés . Cliquez sur OK .
  8. Ajoutez le code suivant avant les autres instructions dans le fichier Class1.cs :
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Ajoutez une nouvelle classe nommée clsES dans le fichier Class1.cs.
  10. Pour utiliser les services COM + transactionnel, votre classe ( clsES ) doit hériter fonctionnalité de ServicedComponent comme suit :
    public class clsES : ServicedComponent
  11. Un attribut de transaction est utilisé pour spécifier le niveau de prise en charge transactionnelle de la classe comme suit :
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Créer une méthode dans la classe clsES et nommez-le 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 :
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. 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 se produisent à l'aide de la base de données suivante :

    note N'oubliez pas de modifier les paramètres de chaîne de connexion suivants afin de refléter les valeurs correctes pour votre serveur SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Définir un bloc try pour capturer des exceptions qui peuvent se produire lors du traitement de la base de données. Vous devez interceptez ces exceptions pour annuler la transaction. Le bloc try inclut deux opérations de base de données. Chaque opération met à jour un champ différent dans un enregistrement de table produits spécifié.
     try { 
    
  15. Effectuer la mise à jour premier de la table Produits. Mettre à jour le champ UnitsonOrder avec la valeur onOrder de produit avec l'ID, comme indiqué dans les deux premiers paramètres d'entrée. Utilisez la commande SQL suivante pour exécuter cette mise à jour SQL :
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Effectuer une autre mise à jour à la table Produits. Le champ UnitsinStock avec mis à jour le inStock valeur pour le produit avec le code, comme indiqué dans les paramètres d'entrée troisième et quatrième. Utilisez la commande SQL suivante pour exécuter cette mise à jour SQL :
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. 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 (met à dans ce cas les deux jour) si aucune erreur n'a été levée :
    ContextUtil.SetComplete();
  18. La connexion à la base de données Les Comptoirs est fermée :
    Conn.Close();
    }
  19. Vous devez intercepter des exceptions qui se produisent lors de l'exécution les commandes SQL afin que vous pouvez annuler la transaction complète :
    catch(Exception e){ 
  20. La méthode setAbort de la classe contextUtil de l'espace de noms System.EnterpriseServices est utilisée pour annuler la transaction complète. 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;
    }
  21. Pour ce composant fonctionner correctement, le composant doit avoir un nom fort. Générer un nom fort et puis signer l'assembly avec le nom fort. Pour ce faire, procédez comme suit :
    1. À l'invite de commandes Visual Studio .NET, tapez sn.exe-k snEnterprise.snk pour créer un fichier de clé. Pour plus d'informations sur la signature des assemblys avec noms forts, consultez la documentation du Kit de développement .NET Framework SDK.
    2. Copiez snEnterprise.snk dans votre dossier de projet.
    3. Dans AssemblyInfo.vc, ajoutez la ligne suivante de code avant ou après les autres instructions attribut assembly :
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
      \\snEnterprise.snk")]
    4. Enregistrez et puis créer un projet.

Terminer la liste de code

note Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
	{
		public SqlConnection Conn;

		public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
				Conn.Open();
				
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
				sqlCommand.ExecuteNonQuery();
				
				sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
				sqlCommand.ExecuteNonQuery();

				ContextUtil.SetComplete();
				Conn.Close();
			}
			catch(Exception e)
			{
				ContextUtil.SetAbort();
			
				throw e;
			}
			finally
			{

			}
		}
	}	
}

Vérifiez qu'il fonctionne

Pour tester ce code, créer une application console qui utilise le projet 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 parce que le numéro de produit spécifiée n'existe pas dans la table Produits. Cela entraîne une erreur de transaction et la transaction est ignorée.
  1. Dans Visual Studio .NET ou Visual Studio 2005, pointez sur Nouveau dans le menu Fichier et cliquez sur le projet .
  2. Cliquez sur projets Visual C# sous types de projet , puis cliquez sur application console sous modèles .

    note Dans Visual Studio 2005, cliquez sur Visual C# sous types de projet , puis cliquez sur application console sous modèles .
  3. Dans la zone de texte Nom , tapez testES . Assurez-vous que l'option Ajouter à la solution est activée.
  4. Cliquez sur OK pour ajouter ce projet à la solution.
  5. Pour testES tester clsES , vous devez ajouter une référence. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Références testES (que vous venez d'ajouter), puis cliquez sur Ajouter une référence .
  6. La boîte de dialogue Ajouter une référence s'affiche. Sous l'onglet projets , double-cliquez sur prjEnterprise .
  7. Une référence s'affiche sous sélectionné composants . Cliquez sur OK pour ajouter cette référence pour le projet.
  8. Ajoutez une référence au projet à la bibliothèque de System.EnterpriseServices. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence .
  9. La boîte de dialogue Ajouter une référence s'affiche. Sous nom de composant sous l'onglet .NET , double-cliquez sur System.EnterpriseServices .
  10. Assurez-vous que System.EnterpriseServices apparaît sous composants sélectionnés . Cliquez sur OK .
  11. Cliquez avec le bouton droit sur l'application de console ( testES ), puis cliquez sur Définir comme projet de démarrage
  12. Collez le code source suivant dans la fonction principale de la classe Class1 :
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    
    				try 
    				{
    					myTest.dbAccess(1, 777, 2, 888);
    					Console.WriteLine("TRANSACTION ONE -- SUCCESS");
    
    					myTest.dbAccess(1, 5, 2, -20);
    					Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    				}
    				catch (Exception e)
    				{
    					Console.WriteLine("TRANSACTION FAILURE");
    				}
  13. Appuyez sur F5 pour exécuter le code de test.

    Dans le code dans l'étape 7, le premier appel dbAccess réussit. Produit 1 et 2 du produit sont en la table Produits. Le champ onOrder de 1 produit est mis à jour 777 et le inStock champ de produit 2 est mis à jour 888. Étant donné que cette transaction a réussi, le message suivant dans la fenêtre de sortie
    OPÉRATION RÉUSSIE ONE - TRANSACTIONS


    L'appel de deuxième dbAccess échoue. Par conséquent, aucune instruction de mise à jour dans dbAccess dans la table Produits est validée dans la base de données. Bien que produit 1 peut avez 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 qui est définie dans la définition de table produit, inStock n'est pas autorisée pour que les nombres négatifs.

    Par conséquent, cet appel à dbAccess échoue et la transaction complète échoue. 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 et s'afficher le message d'erreur suivant dans la fenêtre de sortie :
    FAILURE TRANSACTIONS
  14. Examinez le contenu de la table produits de Northwind à l'aide de SQL Server Enterprise Manager. Lorsque vous affichez produit 1, le champ onOrder est égal à 777. Lorsque vous affichez produit 2, le instock champ est 888. Par conséquent, le second appel dbAccess (qui aurait provoqué dans les différentes valeurs de ces champs) échoue.

Résoudre les 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. Le composant de service 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 l'exemple suivant, la méthode associée est 1 200 secondes pour effectuer n'importe quelle transaction 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 version à des applications distribuées
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Composants de service
http://msdn2.microsoft.com/en-us/library/Aa289839(VS.71).aspx

Propriétés

Numéro d'article: 816141 - Dernière mise à jour: jeudi 22 novembre 2007 - Version: 4.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Initiation
  • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 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: 816141
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