Comment faire pour utiliser transactions COM + dans un composant Visual C++ .NET ou dans un composant Visual C++ 2005

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

Sommaire

SOMMAIRE

Cet article étape par étape explique comment utiliser COM + (Services de composants) transactions dans une classe Visual C++ .NET ou dans une classe Visual C++ 2005. 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

Cet article suppose que vous êtes familiarisé avec les sujets suivants :
  • Concepts transactionnelles et traitement
  • COM + (Services de composants)

Services de transaction COM +

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. Sous types de projets , cliquez sur projets Visual C++ , puis cliquez sur bibliothèque de classes (.NET) sous modèles . Nommez le prjEnterprise de projet.

    note Dans Visual Studio 2005, cliquez sur Visual C++ sous types de projet , puis cliquez sur bibliothèque de classes sous modèles .
  4. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence .
  5. Cliquez sur l'onglet NET dans la boîte de dialogue Ajouter une référence .
  6. Double-cliquez sur System.EnterpriseServices sous le nom de composant .
  7. Assurez-vous que System.EnterpriseServices apparaît sous composants sélectionnés , puis cliquez sur OK .
  8. Ajoutez le code suivant avant les autres instructions dans le fichier prjEnterprise.h:
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlTypes;
    using namespace System::Data::Common;
    using namespace System::EnterpriseServices;
    using namespace System::Data::SqlClient;
    
  9. Ajoutez une nouvelle classe nommée clsES dans le fichier prjEnterprise.h.
  10. Pour utiliser les services COM + transactionnel, assurez-vous que votre classe ( clsES ) hérite fonctionnalité à partir de la classe ServicedComponent comme suit :
    public __gc class clsES:public ServicedComponent
    
  11. Utiliser un attribut de transaction pour spécifier le niveau de prise en charge transactionnelle de la classe comme suit:
    [Transaction(TransactionOption::Required,Timeout=5)]public __gc class clsES:public ServicedComponent
    
  12. Créer une méthode dans la classe clsES qui reçoit les quatre paramètres entiers entrée. Nommez le dbAccess de classe. 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:	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 :
    SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
    Conn->Open();
    Mémoriser Remarque pour modifier les paramètres de chaîne de connexion afin de refléter les valeurs correctes pour votre serveur SQL Server.
  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 table produits spécifié.
    try { 
    
  15. Effectuer la mise à jour premier de la table Produits. Mettre à jour le champ Unités commandées 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 Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
    sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
    sqlCommand->ExecuteNonQuery();
    
  16. Effectuer une autre mise à jour à la table Produits. Le champ Unités en stock 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
    sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
    sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
    	40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
    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. Utilisez le code suivant pour fermer la connexion à la base de données Les Comptoirs :
    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 your connection string parameters to reflect the correct values for your SQL Server server.
#pragma once

using namespace System;
using namespace System::Data;
using namespace System::Data::SqlTypes;
using namespace System::Data::Common;
using namespace System::EnterpriseServices;
using namespace System::Data::SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption::Required,Timeout=5)]
	public __gc class clsES:public ServicedComponent
	{
	public:	SqlConnection * Conn;

	public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
				Conn->Open();
				
				SqlCommand * sqlCommand = new SqlCommand("UPDATE Products SET UnitsonOrder = @onOrderString WHERE productID = @pID1String ", Conn);
				sqlCommand->Parameters->Add(new SqlParameter("@onOrderString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,onOrder.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID1String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID1.ToString()));
				sqlCommand->ExecuteNonQuery();
				
				sqlCommand->CommandText = "UPDATE Products SET UnitsinStock = @inStockString WHERE productID = @pID2String" ;
				sqlCommand->Parameters->Add(new SqlParameter("@inStockString",SqlDbType::VarChar ,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,inStock.ToString()));
				sqlCommand->Parameters->Add(new SqlParameter("@pID2String", SqlDbType::VarChar,
					40,ParameterDirection::Input,true,0,0,"Description",DataRowVersion::Current,pID2.ToString()));
				sqlCommand->ExecuteNonQuery();

				ContextUtil::SetComplete();
				Conn->Close();
			}
			catch(Exception * e)
			{
				ContextUtil::SetAbort();
			
				throw e;
			}			
		}
	};


}
Remarque vous devez ajouter l'option compilateur courants langue runtime prise en charge (/ clr:oldSyntax) de Visual C++ 2005 pour compiler avec succès l'exemple de code précédent. Pour ajouter l'option langue exécution prise en charge compilateur courantes dans Visual C++ 2005, procédez comme suit :
  1. Cliquez sur le projet , puis cliquez sur <ProjectName>Propriétés.

    note <ProjectName>est un espace réservé pour le nom du projet.
  2. Développez les propriétés de configuration , puis cliquez sur général .
  3. Cliquez pour sélectionner Common Language Runtime Support, l'ancienne syntaxe (/ clr:oldSyntax) dans le paramètre projet prend en charge du Common Language Runtime dans le volet droit, cliquez sur Appliquer , puis cliquez sur OK .
Pour plus d'informations sur le common language runtime prennent en charge option de compilateur, reportez-vous au site de Web Microsoft suivant adresse :
/CLR (Common Language Runtime compilation)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx

Vérifier qu'il fonctionne

Pour tester ce code, créez un projet d'application console qui utilise la classe clsES . Dans un cas, une transaction réussit et les champs UnitsOnOrder et unités en stock pour le produit spécifié sont mis à jour. Dans le second cas, la mise à jour pour le champ Unités commandées pour un produit spécifié réussit, mais la mise à jour pour le champ Unités en stock pour un produit échoue car le numéro de produit spécifiée n'existe pas dans la table Produits. Cela provoque une erreur de transaction et la transaction est ignorée.
  1. Début Visual Studio .NET ou Visual Studio 2005.
  2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
  3. Sous types de projets , cliquez sur projets Visual C++ , puis cliquez sur application console (.NET) sous modèles .

    note Dans Visual Studio 2005, cliquez sur Visual C++ sous types de projet , puis cliquez sur application console CLR sous modèles .
  4. Dans la zone de texte Nom , tapez testES . Assurez-vous que l'option Ajouter à la solution est activée.
  5. Cliquez sur OK pour ajouter ce projet à la solution.
  6. Pour testES tester prjEnterprise , 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 .
  7. La boîte de dialogue Ajouter une référence s'affiche. Sous l'onglet projets , double-cliquez sur prjEnterprise .
  8. Une référence s'affiche sous sélectionné composants . Cliquez sur OK pour ajouter cette référence pour le projet.
  9. Ajoutez une référence au projet à l'espace de noms System.EnterpriseServices . Dans l'Explorateur de solutions, cliquez avec le bouton droit sur Références , puis cliquez sur Ajouter une référence .
  10. 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 .
  11. Assurez-vous que System.EnterpriseServices apparaît sous composants sélectionnés . Cliquez sur OK .
  12. Cliquez avec le bouton droit sur testES , puis cliquez sur Définir comme projet de démarrage .
  13. Collez le code source suivant dans la fonction _tmain() de la classe testES :
    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");
    	//Console::WriteLine("Error Message: {0}",e->Message);	 
    	//uncomment this line if you must get detailed error information
    }
    
  14. 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, vous recevez le message suivant dans la fenêtre de sortie :
    TRANSACTIONS OPÉRATION RÉUSSIE ONE-
    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 les produits 1 peut avoir son champ Unités commandées mis à jour pour 5 , produit 2 ne peut pas avez son champ de ce dernier -20 . En raison d'une contrainte définie dans la définition de la table Produits, ce dernier 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
  15. Examinez le contenu de la table produits de Northwind à l'aide de SQL Server Enterprise Manager. Lorsque vous affichez produit 1, le champ Unités commandées est égal à 777 . Lorsque vous affichez produit 2, le champ Unités en stock est 888 . Par conséquent, le second appel dbAccess (qui aurait provoqué dans les différentes valeurs de ces champs) échoue.

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. 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)]
    
  • Vous pouvez recevoir certaines exceptions inattendues lors de l'exécution le code. Pour recevoir plus d'informations sur ces exceptions, retirez les commentaires les deux dernières lignes de l'étape 13 :
    Console::WriteLine("Error Message: {0}",e->Message);
    uncomment this line if you must get detailed error information

Références

Pour plus d'informations, reportez-vous aux Web MSDN (Microsoft Developer Network) sites adresses suivantes :
Intégration de COM +: comment .NET Enterprise Services peuvent vous aident version à des applications distribuées
Composants de service

Propriétés

Numéro d'article: 815814 - Dernière mise à jour: mercredi 14 novembre 2007 - Version: 3.2
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
Mots-clés : 
kbmt kbsqlclient kbcomplusqc kbcode kbhowtomaster kbhowto KB815814 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: 815814
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