Jak používat v součásti Visual C++ .NET nebo Visual C++ 2005 součást transakce COM +

Překlady článku Překlady článku
ID článku: 815814 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Shrnutí

Tento podrobný článek popisuje způsob použití COM + (služby komponent) transakce ve třídě Microsoft Visual C++ .NET nebo Microsoft Visual C++ 2005 třídy. Sadu operací databáze je považován za jednu jednotku. Buď proběhnou všechny operace úspěšně, nebo pokud jedna operace selže, selže celý transakce. V druhém případě není databázové operace, které byly zaúčtovány na podkladové databáze.

Požadavky

Tento článek předpokládá znalost následujících témat:
  • Transakční koncepty a zpracování
  • COM + (služby komponent)

Transakční služby

Můžete implementovat s oborem názvů služby System.EnterpriseServices v Microsoft .NET Framework zpracování transakcí. Transakční služby přístup COM + vytvoření třídy. Postupujte takto:
  1. Spustit Visual Studio .NET nebo Visual Studio 2005.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V části Typy projektu klepněte na položku Projekty Visual C++ a v části šablony klepněte na příkaz Knihovna tříd (.NET). Název projektu prjEnterprise.

    Poznámka: V aplikaci Visual Studio 2005 Visual C++ klepněte v části Typy projektu a v části šablony klepněte na příkaz Knihovny tříd.
  4. V aplikaci Solution Explorer klepněte pravým tlačítkem myši odkazy a potom klepněte na tlačítko Přidat odkaz.
  5. Klepněte na kartu NET v dialogové okno Přidat odkaz.
  6. Poklepejte na služby System.EnterpriseServices pod název součásti.
  7. Ujistěte se, že služby System.EnterpriseServices se zobrazí v části Vybrané součásti a klepněte na tlačítko OK.
  8. Přidejte následující kód před ostatní příkazy v souboru 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. Přidat novou třídu s názvem clsES souboru prjEnterprise.h.
  10. Chcete-li použít transakční služby COM +, zkontrolujte, že třídy (clsES) dědí funkce z třídy ServicedComponent způsobem:
    public __gc class clsES:public ServicedComponent
    
  11. Použijte atribut Transaction ur?ení úroveň transakční podporu pro třídu:
    [Transaction(TransactionOption::Required,Timeout=5)]public __gc class clsES:public ServicedComponent
    
  12. Vytvořit metodu clsES třídy, která přijímá čtyři parametry vstupní celé číslo. Název třídy dbAccess. První dva parametry poskytnout ID produktu a jednotky na objednávce pro daný produkt. Druhý dva parametry poskytnout ID produktu a jednotky na skladě pro daný produkt. Tato metoda provádí sadu operací databáze proti tyto zadaný kód product ID, které jsou považovány za transakce:
    public:	void dbAccess(int pID1, int onOrder, int pID2, int inStock)
  13. V metodě dbAccess vytvořit objekt připojení SQL Northwind databázi a otevřete připojení. Operace databáze dojít pomocí následující databáze:
    SqlConnection * Conn = new SqlConnection("user id=<username>;password=<password>;Initial Catalog=northwind;Data Source=<Your SQL Server name>;");
    Conn->Open();
    Zapamatovat Poznámka: Chcete-li změnit parametry řetězec připojení tak, aby odrážel správné hodnoty SQL serveru.
  14. Nastavit akci bloku k zachycení výjimek, které mohou nastat během zpracování databáze. Tyto výjimky přerušení transakce musí zachytit. Zkuste bloku zahrnuje dvě operace databáze. Každá operace aktualizuje jiné pole v záznamu tabulky určené produkty.
    try { 
    
  15. Provést první aktualizaci tabulky produkty. Aktualizovat pole ObjednánoJednotek s hodnotou onOrder produktu s ID, zadané v první dva vstupní parametry. Použít následující příkaz SQL ke spuštění této aktualizace 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. Provést jiné aktualizaci tabulky produkty. Aktualizace pole JednotkyNaSkladě s inStock hodnotu pro produkt s ID, zadané v třetí a čtvrtý vstupní parametry. Použít následující příkaz SQL ke spuštění této aktualizace 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. Protože tyto aktualizace jsou součástí transakce COM +, jsou jako jednotka potvrzené. Metoda setCompletecontextUtil třídu z oboru názvů služby System.EnterpriseServices slouží k potvrzení transakce (v tomto případě dvě aktualizuje) Pokud byly vyvolána žádné chyby:
    ContextUtil::SetComplete(); 
    
  18. Ukončete připojení k databázi Northwind pomocí následující kód:
    Conn->Close(); }
    
  19. Musí zachytit výjimky, které se vyskytnou při spuštění příkazů SQL, takže přerušení celé transakce:
    catch(Exception * e){ 
    
  20. Metoda setAbortcontextUtil třídu z oboru názvů služby System.EnterpriseServices slouží k přerušení celé transakce. Pokud je první aktualizace úspěšné a druhý aktualizace nezdaří, ani aktualizace zaúčtována do tabulky produkty. Vyvolání výjimky zachytil volajícímu označující, že transakce se nezdařilo:
    ContextUtil::SetAbort();
    throw e; }
    
  21. Pro tuto součást fungovat správně musí mít součást silného názvu. Generovat silného názvu a podepsat sestavení se silným názvem. Postupujte takto:
    1. Visual Studio .NET příkazového řádku zadejte snEnterprise.snk sn.exe -k vytvoření souboru klíče. Další informace o podepisování sestavení s silné názvy dokumentaci .NET Framework SDK.
    2. SnEnterprise.snk zkopírujte do složky projektu.
    3. V AssemblyInfo.vc, přidejte následující řádek kódu, před nebo za jiné příkazy atribut sestavení:
      [assembly:AssemblyKeyFileAttribute("..\\snEnterprise.snk")]; 
    4. Uložit a vytvořit projektu.

Úplný výpis kódu

Poznámka: 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;
			}			
		}
	};


}
Poznámka je třeba přidat společného jazykového modulu runtime podporují možnost kompilátoru (/ clr:oldSyntax) v Visual C++ 2005 úspěšně zkompilovat předchozí ukázkový kód. Přidat běžné podporu kompilátor možnost runtime jazyka Visual C++ 2005, postupujte takto:
  1. Klepněte na tlačítko projekt a klepněte na tlačítko <ProjectName> Vlastnosti.

    Poznámka:<ProjectName> je zástupný název projektu.
  2. Rozbalte položku Konfigurace vlastnosti a potom klepněte na položku Obecné.
  3. Klepnutím vyberte Common Language Runtime podpory, staré syntaxe (/ clr:oldSyntax) v podporují Common Language Runtime projektu nastavení v pravém podokně, klepněte na tlačítko použít a potom klepněte na tlačítko OK.
Další informace o společného jazykového modulu runtime podporují možnost kompilátoru naleznete na následujícím webu:
/ clr (Common Language Runtime kompilace)
http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx

Ověřte, zda funguje

Testovat tento kód vytvořit projekt aplikace konzoly, který používá třída clsES. V jednom případě úspěšné transakce a polí JednotkyNaSkladě a ObjednánoJednotek pro určený produkt jsou aktualizovány. V druhém případě úspěšná aktualizace pole ObjednánoJednotek určený produkt, ale aktualizace pro pole JednotkyNaSkladě produktu nezdaří, protože číslo určený produkt neexistuje v tabulce Výrobky. To způsobí selhání transakce a transakce je ignorována.
  1. Zahájení Visual Studio .NET nebo Visual Studio 2005.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. V části Typy projektu klepněte na položku Projekty Visual C++ a klepněte na tlačítko Console Application (.NET) v části šablony.

    Poznámka: V aplikaci Visual Studio 2005 Visual C++ klepněte v části Typy projektu a klepněte v části šablonyAplikace konzoly CLR.
  4. Do textového pole název zadejte testES. Ujistěte se, zda je vybrána možnost Přidat k řešení.
  5. Klepnutím na tlačítko OK přidejte tento projekt řešení.
  6. TestES otestovat prjEnterprise musíte přidat odkaz. V aplikaci Solution Explorer klepněte pravým tlačítkem myši odkazy pod testES (právě přidaného) a potom klepněte na tlačítko Přidat odkaz.
  7. Zobrazí se dialogové okno Přidat odkaz. Na kartě projekty poklepejte prjEnterprise.
  8. Odkaz se zobrazí pod vybrané součásti. Klepněte na tlačítko OK přidejte tento odkaz k projektu.
  9. Přidat odkaz do projektu obor názvů služby System.EnterpriseServices. V aplikaci Solution Explorer klepněte pravým tlačítkem myši odkazy a potom klepněte na tlačítko Přidat odkaz.
  10. Zobrazí se dialogové okno Přidat odkaz. V části Název součásti na kartě .NET poklepejte služby System.EnterpriseServices.
  11. Ujistěte se, že služby System.EnterpriseServices se zobrazí v části Vybrané součásti. Klepněte na tlačítko OK.
  12. TestES klepněte pravým tlačítkem myši a potom klepněte na tlačítko nastavit jako spouštěcí projektu.
  13. Vložte následující kód zdroje v _tmain() funkce třídy 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. Stisknutím klávesy F5 spustit testovací kód.

    V kódu v kroku 7 první volání dbAccess úspěšné. Produkt 1 a 2 produktů jsou v tabulce Výrobky. Aktualizaci pole onOrder pro produkt 1 777 a inStock pole pro technické 2 je aktualizován 888. Protože tato transakce proběhla úspěšně, zobrazí následující zpráva v okně výstupu:
    TRANSAKCE ÚSPĚCH JEDNOHO-
    Druhé volání dbAccess selže. Proto ani příkaz update v dbAccess tabulky Výrobky je zaúčtována do databáze. Ačkoli produktu 1 by mít jeho pole ObjednánoJednotek aktualizovány 5, produkt 2 nemůže mít jeho pole JednotkyNaSkladě nastavit -20. Z důvodu omezení, která je definována v definici tabulky produktu není povoleno JednotkyNaSkladě mít záporná čísla. Proto toto volání dbAccess selže a celá transakce selže. Tabulky Výrobky zůstane jako bylo před volání dbAccess. Příkaz zachytit zpracovává oznámení o selhání transakce z dbAccess a zobrazí následující chybová zpráva v okně výstupu:
    SELHÁNÍ TRANSAKCE
  15. Zkontrolujte obsah tabulky Výrobky Northwind pomocí SQL Server Enterprise Manager. Při zobrazení produktu 1 se rovná 777 pole ObjednánoJednotek. Při zobrazení 2 produktů je pole JednotkyNaSkladě888. Druhé volání dbAccess (který by způsobil různé hodnoty těchto polí) se tedy nezdaří.

Odstraňování potíží

  • Zkontrolujte, zda má projekt, který používá služby COM + silného názvu.
  • Třída, která používá služby COM + musí dědit z servisu součásti. Součást servisu je umístěn v oboru názvů služby System.EnterpriseServices.
  • Při ladění, může transakce časového limitu před potvrzena nebo přerušena. Chcete-li se vyhnout časový limit, použijte vlastnost časový limit atribut transakce. V následujícím příkladu má související metodu 1 200 sekund před časový limit dokončení libovolné transakci:
    [Transaction(TransactionOption::Required,Timeout=1200)]
    
  • Některé výjimky neočekávané obdržet při spuštění kódu. Zobrazí informace o tyto výjimky, vložte poslední dva řádky v kroku 13:
    Console::WriteLine("Error Message: {0}",e->Message);
    uncomment this line if you must get detailed error information

Odkazy

Další informace naleznete na následujících webech Microsoft Developer Network (MSDN):
COM + Integration: Jak .NET Enterprise Services může Nápověda je sestavit distribuovaných aplikací
Součásti servisu

Vlastnosti

ID článku: 815814 - Poslední aktualizace: 14. listopadu 2007 - Revize: 3.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
Klíčová slova: 
kbmt kbsqlclient kbcomplusqc kbcode kbhowtomaster kbhowto KB815814 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:815814

Dejte nám zpětnou vazbu

 

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