Jak korzystać z transakcji COM+ w składniku Visual C#

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 816141 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Streszczenie

W tym artykule opisano krok po kroku sposób korzystania z transakcji COM+ (dostępnych w przystawce Usługi składowe) w klasie Visual C#. Zestaw operacji na bazie danych stanowi jeden moduł. Aby transakcja zakończyła się powodzeniem, wszystkie operacje muszą zakończyć się pomyślnie. W takim przypadku w bazie danych nie są rejestrowane żadne operacje, które próbowano wykonać.

Wymagania

W dalszej części artykułu opisano zalecany sprzęt, oprogramowanie, infrastrukturę sieci oraz wymagane umiejętności, wiedzę i dodatki Service Pack:
  • System Microsoft Windows 2000 Server z dodatkiem SP1
  • Internetowe usługi informacyjne (IIS) Microsoft w wersji 4.0 lub nowszej
  • Program Microsoft Internet Explorer w wersji 5.0, 5.5 lub 6.0
W artykule założono, że czytelnik zna następujące tematy:
  • Pojęcia dotyczące transakcji i mechanizmy ich przetwarzania
  • COM+ (składnik przystawki Usługi składowe)

Usługi transakcyjne COM+

Mechanizmy przetwarzania transakcji można zaimplementować w obszarze nazw System.EnterpriseServices w systemie Microsoft .NET Framework. Uzyskanie dostępu do usług transakcyjnych COM+ wymaga utworzenia klasy. Aby to zrobić, wykonaj następujące kroki:
  1. Uruchom program Visual Studio .NET lub Visual Studio 2005.
  2. W menu File wskaż polecenie New a następnie kliknij pozycję Project.
  3. W obszarze Project Types kliknij pozycję Visual C# Projects, a następnie w obszarze Templates kliknij pozycję Class Library. Nadaj projektowi nazwę prjEnterprise.

    Uwaga: W programie Visual Studio 2005 kliknij opcję Visual C# w obszarze Project Types (Typy projektów), a następnie kliknij opcję Class Library (Biblioteka typów) w obszarze Templates (Szablony). Nadaj projektowi nazwę prjEnterprise.
  4. Domyślnie zostanie utworzona klasa Class1.
  5. W oknie Solution Explorer kliknij prawym przyciskiem myszy folder References, a następnie kliknij polecenie Add Reference.
  6. Zostanie wyświetlone okno dialogowe Add Reference. Na karcie .NET w obszarze Component Name kliknij dwukrotnie pozycję System.EnterpriseServices.
  7. Upewnij się, że w oknie Selected Components pojawił się wpis System.EnterpriseServices. Kliknij przycisk OK.
  8. W pliku Class1.cs przed wszystkimi innymi instrukcjami dodaj następujący kod:
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Dodaj do pliku Class1.cs nową klasę o nazwie clsES.
  10. Aby można było korzystać z usług transakcyjnych COM+, ta klasa (clsES) musi dziedziczyć funkcje klasy ServicedComponent w następujący sposób:
    public class clsES : ServicedComponent
  11. Atrybut Transaction jest używany do określenia poziomu obsługi transakcyjnej dla danej klasy w następujący sposób:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. W klasie clsES utwórz metodę o nazwie dbAccess. Metoda będzie zawierać cztery parametry wejściowe w postaci liczb całkowitych. Pierwsze dwa parametry określają identyfikator produktu i liczbę jednostek zamówienia produktu. Druga para parametrów określa identyfikator produktu i liczbę jednostek produktu znajdujących się na stanie. Ta metoda powoduje wykonanie zbioru operacji związanych z bazą danych przy użyciu określonych identyfikatorów produktu. Operacje stanowią łącznie pojedynczą transakcję:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. W metodzie dbAccess utwórz obiekt połączenia SQL do bazy danych Northwind, a następnie otwórz to połączenie. Operacje są wykonywane na następującej bazie danych:

    Uwaga: Należy pamiętać o zmianie wymienionych poniżej parametrów ciągu połączenia w taki sposób, aby odzwierciedlały rzeczywiste wartości używanego serwera SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Ustaw blokadę try w celu przechwytywania wszystkich wyjątków, które mogą wystąpić podczas wykonywania operacji na bazie danych. Rejestracja wyjątków jest niezbędna do przerwania transakcji. Blokada try zawiera dwie operacje bazy danych. Każda operacja powoduje aktualizację innego pola w określonym rekordzie tabeli produktów.
     try { 
    
  15. Wykonaj pierwszą aktualizację tabeli produktów. Zaktualizuj pole UnitsonOrder przy użyciu wartości onOrder dla produktu o danym identyfikatorze, zgodnie z wartościami dwóch pierwszych parametrów wejściowych. Użyj następującego polecenia SQL w celu uruchomienia tej aktualizacji SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Wykonaj kolejną aktualizację tabeli produktów. Zaktualizuj pole UnitsinStock przy użyciu wartości inStock dla produktu o danym identyfikatorze, zgodnie z wartościami trzeciego i czwartego parametru wejściowego. Użyj następującego polecenia SQL w celu uruchomienia tej aktualizacji SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. Aktualizacje są częścią transakcji COM+, dlatego są zatwierdzane jako całość. Jeżeli nie zostały zgłoszone żadne błędy, do zatwierdzania transakcji (w tym przypadku — obu aktualizacji) jest wykorzystywana metoda setComplete klasy contextUtil obszaru nazw System.EnterpriseServices:
    ContextUtil.SetComplete();
  18. Połączenie z bazą danych Northwind jest zamykane:
    Conn.Close();
    }
  19. Podczas wykonywania poleceń SQL należy wychwycić wszystkie wyjątki, tak aby można było przerwać całą transakcję:
    catch(Exception e){ 
  20. Metoda setAbort klasy contextUtil obszaru nazw System.EnterpriseServices służy do anulowania całej transakcji. Jeśli pierwsza aktualizacja zakończy się pomyślnie, ale druga aktualizacja zakończy się niepowodzeniem, żadna z aktualizacji nie zostanie uwzględniona w tabeli produktów. Przechwycony wyjątek jest odsyłany do obiektu wywołującego w celu poinformowania go, że transakcja się nie powiodła:
    ContextUtil.SetAbort();
    				throw e;
    }
  21. Ten składnik musi mieć silną nazwę, aby poprawnie działać. Wygeneruj ją, a następnie podpisz nią zestaw. Aby to zrobić, wykonaj następujące kroki:
    1. W wierszu polecenia programu Visual Studio .NET wpisz polecenie sn.exe -k snEnterprise.snk, które spowoduje utworzenie pliku klucza. Więcej informacji na temat podpisywania zestawów przy użyciu silnych nazw można znaleźć w dokumentacji zestawu SDK systemu .NET Framework.
    2. Skopiuj plik snEnterprise.snk do folderu projektu.
    3. W pliku AssemblyInfo.vc przed lub po innych instrukcjach dotyczących atrybutów zestawu dodaj następujący wiersz kodu:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Zapisz plik, a następnie skompiluj projekt.

Pełny kod programu



Uwaga: Należy pamiętać o zmianie wymienionych poniżej parametrów ciągu połączenia w taki sposób, aby odzwierciedlały rzeczywiste wartości używanego serwera SQL 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
			{

			}
		}
	}	
}

Sprawdzanie działania

Aby przetestować ten kod, należy utworzyć aplikację konsoli wykorzystującą projekt clsES. W pierwszym przypadku transakcja kończy się powodzeniem, a pola onOrder i inStock danego produktu są aktualizowane. W drugim przypadku aktualizacja pola onOrder wskazanego produktu jest wykonywana pomyślnie, ale aktualizacja pola inStock kończy się niepowodzeniem, ponieważ podany numer produktu nie istnieje w tabeli Produkty. Efektem jest niepowodzenie transakcji i jej zignorowanie.
  1. W programie Visual Studio .NET lub Visual Studio 2005 wskaż polecenie New (Nowy) w menu File (Plik), a następnie kliknij polecenie Project (Projekt).
  2. W obszarze Project Types kliknij pozycję Visual C# Projects, a następnie w obszarze Templates kliknij pozycję Console Application.

    Uwaga: W programie Visual Studio 2005 należy kliknąć opcję Visual C# w obszarze Project Types (Typy projektów), a następnie kliknąć opcję Console Application (Aplikacja konsoli) w obszarze Templates (Szablony).
  3. W polu tekstowym Name wpisz nazwę testES. Upewnij się, że jest zaznaczona opcja Add to Solution.
  4. Kliknij przycisk OK, aby dodać ten projekt do programu.
  5. Aby aplikacja testES sprawdzała projekt clsES, należy dodać odwołanie. W oknie Solution Explorer w obszarze aplikacji testES (która została właśnie dodana) prawym przyciskiem myszy kliknij pozycję References, a następnie kliknij polecenie Add Reference.
  6. Zostanie wyświetlone okno dialogowe Add Reference. Na karcie Projects kliknij dwukrotnie pozycję prjEnterprise.
  7. W obszarze Selected Components pojawi się odwołanie. Aby dodać je do projektu, kliknij przycisk OK.
  8. Dodaj odwołanie do tego projektu do biblioteki System.EnterpriseServices. W oknie Solution Explorer kliknij prawym przyciskiem myszy pozycję References (Odwołania), a następnie kliknij polecenie Add Reference (Dodaj odwołanie).
  9. Zostanie wyświetlone okno dialogowe Add Reference. Na karcie .NET w obszarze Component Name kliknij dwukrotnie pozycję System.EnterpriseServices.
  10. Upewnij się, że w oknie Selected Components pojawił się wpis System.EnterpriseServices. Kliknij przycisk OK.
  11. Kliknij prawym przyciskiem myszy aplikację konsoli (testES), a następnie kliknij polecenie Set as Startup Project.
  12. Wklej następujący kod źródłowy do funkcji Main klasy Class1:
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    
    				try 
    				{
    					myTest.dbAccess(1, 777, 2, 888);
    					Console.WriteLine("TRANSAKCJA PIERWSZA – POWODZENIE");
    
    					myTest.dbAccess(1, 5, 2, -20);
    					Console.WriteLine("TRANSAKCJA DRUGA – POWODZENIE");
    				}
    				catch (Exception e)
    				{
    					Console.WriteLine("NIEPOWODZENIE TRANSAKCJI");
    				}
  13. Naciśnij klawisz F5, aby uruchomić kod testowy.

    W kodzie w kroku 7 pierwsze wywołanie metody dbAccess kończy się powodzeniem. Produkty 1 i 2 znajdują się w tabeli Produkty. Pole onOrder produktu 1 jest aktualizowane do wartości 777, a pole inStock produktu 2 — do wartości 888. Ponieważ transakcja została wykonana pomyślnie, w oknie wyników pojawi się następujący komunikat:
    TRANSAKCJA PIERWSZA – POWODZENIE


    Drugie wywołanie metody dbAccess kończy się niepowodzeniem. Żadna instrukcja aktualizacji tabeli Produkty zawarta w metodzie dbAccess nie jest więc uwzględniana w bazie danych. Pole onOrder produktu 1 mogło być zaktualizowane do wartości 5, ale pola inStock produktu 2 nie można zaktualizować do wartości -20. Ze względu na ograniczenie zawarte w definicji tabeli Produkty w polu inStock nie mogą się znajdować wartości ujemne.

    Z tego powodu to wywołanie metody dbAccess kończy się niepowodzeniem, a więc cała transakcja również kończy się niepomyślnie. Zawartość tabeli Produkty pozostaje taka sama, jak przed wywołaniem metody dbAccess. Instrukcja catch obsługuje wysłanie z metody dbAccess powiadomienia o niepowodzeniu transakcji. W oknie wyników pojawia się wtedy następujący komunikat o błędzie:
    NIEPOWODZENIE TRANSAKCJI
  14. Przejrzyj zawartość tabeli Produkty bazy danych Northwind przy użyciu programu SQL Server Enterprise Manager. Okaże się, że dla produktu 1 wartość w polu onOrder wynosi 777, a dla produktu 2 wartość w polu inStock wynosi 888. Jak widać, drugie wywołanie metody dbAccess (którego efektem byłyby inne wartości w tych polach) zakończyło się niepowodzeniem.

Rozwiązywanie problemów

  • Należy się upewnić, że każdy projekt wykorzystujący usługi COM+ ma silną nazwę.
  • Każda klasa korzystająca z usług COM+ musi dziedziczyć ustawienia obsługiwanego składnika. Obsługiwany składnik znajduje się w obszarze nazw System.EnterpriseServices.
  • Podczas debugowania przed zatwierdzeniem lub anulowaniem transakcji może upłynąć przewidziany limit czasu. Aby uniknąć takiej sytuacji, należy odpowiednio ustawić właściwość limitu w atrybucie transakcji. W następującym przykładzie skojarzona metoda ma 1200 sekund na wykonanie każdej transakcji:
    [Transaction(TransactionOption.Required,timeout:=1200)]

Materiały referencyjne

Aby uzyskać dodatkowe informacje, odwiedź następujące witryny MSDN (Microsoft Developer Network) w sieci Web:
COM+ Integration: How .NET Enterprise Services Can Help You Build Distributed Applications
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Obsługiwane składniki:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/f_and_m/html/vxconInterop.asp

Właściwości

Numer ID artykułu: 816141 - Ostatnia weryfikacja: 4 października 2006 - Weryfikacja: 3.2
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005
Słowa kluczowe: 
kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141

Przekaż opinię

 

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