Jak používat transakce COM + v součásti Visual C#

Microsoft Visual Basic .NET verzi tohoto článku naleznete v 315707 .

V TOMTO ÚKOLU

Souhrn

Tento podrobný článek popisuje způsob použití transakcí modelu COM + (Component Services) v jazyce Visual C# třídy. Sadu operací databáze je považovány za jednu jednotku. Buď všechny operace proběhnou úspěšně, nebo pokud jedna operace selže, selže celý transakce. V takovém případě nejsou zaúčtovány žádné databázové operace, které byly pokusu s podkladovou databází.


zpět na horní

Požadavky

Následující položky popisují doporučený hardware, software, síťovou infrastrukturu, dovednosti a knowledge a aktualizace service Pack, které musí mít:
  • Microsoft Windows 2000 Server s aktualizací SP1
  • Internetová informační služba (IIS) verze 4.0 nebo novější
  • Aplikace Microsoft Internet Explorer verze 5.0, 5.5 nebo 6.0
Tento článek předpokládá, že jste obeznámeni s následující:
  • Transakční koncepty a zpracování
  • COM + (Component Services)
zpět na horní

Transakční služby

Můžete implementovat pomocí služby System.EnterpriseServices obor názvů v rozhraní.NET Framework Microsoft zpracování transakcí. Chcete-li získat přístup k transakční služby modelu COM +, vytvořte třídu. Chcete-li to provést, postupujte takto:
  1. Spusťte aplikaci Visual Studio .NET nebo Visual Studio 2005.
  2. V nabídce soubor přejděte na příkaz
    Novýa potom klikněte na projekt.
  3. Klepněte na položku Visual C# projekty ve skupinovém rámečku
    Typy projektůa v části šablonyklepněte na příkaz Knihovny tříd. Název projektu
    prjEnterprise.

    Poznámka: V aplikaci Visual Studio 2005 klepněte Visual C# ve skupinovém rámečku
    Typy projektůa v části šablonyklepněte na příkaz Knihovny tříd. Název projektu
    prjEnterprise.
  4. Ve výchozím nastavení je vytvořen Class1.
  5. V Průzkumníku řešení klikněte pravým tlačítkem myši
    Odkazya potom klepněte na tlačítko Přidat odkaz.
  6. Zobrazí se dialogové okno Přidat odkaz . V části Název součásti na kartě .NET poklepejte na služby System.EnterpriseServices.
  7. Ujistěte se, že služby System.EnterpriseServicesse zobrazí v seznamu Vybrané součásti. Klepněte na tlačítko OK
  8. Přidejte následující kód před všechny ostatní příkazy v souboru Class1.cs:
    using System.EnterpriseServices;using System.Data.SqlClient;
  9. Přidáte novou třídu s názvem clsES souboru Class1.cs.
  10. Použití transakční služby modelu COM +, (clsES) vaší třídy musí dědit funkčnost z ServicedComponent takto:
    public class clsES : ServicedComponent
  11. Atribut transakce se používá k určení úrovně transakční podpora třídy takto:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Vytvořte metodu ve třídě clsES s názvem dbAccess obdrží čtyři parametry vstupní celé číslo. První dva parametry poskytnout ID produktu a jednotky na zakázku pro daný produkt. Další dva parametry poskytnout ID produktu a jednotky na skladě pro daný produkt. Tato metoda provádí sadu operací databáze proti tyto zadaný product ID, které jsou považovány za transakce:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. V metodě dbAccess vytvořit objekt připojení SQL pro databázi Northwind a poté otevřete připojení. Operace databáze, ke kterým dochází pomocí následující databáze:

    Poznámka: Nezapomeňte změnit následující parametry řetězec připojení tak, aby odrážely správné hodnoty pro server SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");Conn.Open();

  14. Nastavte akci blok zachytit všechny výjimky, které mohou nastat při zpracování databáze. Musí zachytit tyto výjimky přerušit transakci. Zkuste bloku zahrnuje dva databázové operace. Každá operace aktualizuje jiné pole v záznamu tabulky uvedených produktů.
     try { 
  15. Proveďte první aktualizaci tabulky produkty. Aktualizujte hodnotu produktu s ID, zadané v první dva vstupní parametry – objednané pole ObjednánoJednotek . Použijte následující příkaz SQL ke spuštění této aktualizace SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);sqlCommand.ExecuteNonQuery();
  16. Proveďte další aktualizace tabulky produkty. Aktualizovat pole JednotkyNaSkladě inStock hodnotu produktu s ID, zadané v třetí a čtvrtý vstupní parametry. Použijte následující příkaz SQL ke spuštění této aktualizace SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;sqlCommand.ExecuteNonQuery();

  17. Protože tyto aktualizace jsou součástí transakce COM +, jsou jako jednotka potvrzené. Metoda setComplete contextUtil třídy z oboru názvů služby System.EnterpriseServices se používá k potvrzení transakce (v tomto případě dvě aktualizace) Pokud byly vyvolány žádné chyby:
    ContextUtil.SetComplete();
  18. Ukončení připojení k databázi Northwind:
    Conn.Close();}
  19. Musí se zachytit všechny výjimky, ke kterým dochází při spuštění příkazů SQL tak, aby je přerušení celé transakce:
    catch(Exception e){ 
  20. Metoda setAbort contextUtil třídy z oboru názvů služby System.EnterpriseServices se používá k přerušení celé transakce. Pokud je první aktualizace úspěšné a druhá aktualizace nezdaří, ani aktualizace je zaúčtována do tabulky produkty. Zachycenou výjimku je vyvolána volajícímu označující, že transakce se nezdařilo:
    ContextUtil.SetAbort();throw e;
    }
  21. Pro správnou funkci této součásti komponenty musí mít silný název. Generovat silného názvu a pak podepsat sestavení se silným názvem. Chcete-li to provést, postupujte takto:
    1. Zadejte na příkazovém řádku sady Visual Studio .NET
      snEnterprise.snk sn.exe -k vytvoření souboru klíče. Další informace o podepisování sestavení s silné názvy naleznete v dokumentaci k rozhraní.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 sestavení atribut:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]
    4. Uložte a potom sestavit projekt.
zpět na horní

Úplný výpis kódu

Poznámka: Nezapomeňte změnit následující parametry řetězec připojení tak, aby odrážely správné hodnoty pro server 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
{

}
}
}
}

zpět na horní

Ověřte, zda funguje

K otestování tohoto kódu, vytvoření aplikace konzoly, která používá projektu clsES. V jednom případě úspěšné transakce a – objednané a instock pole pro určený produkt jsou aktualizována. V druhém případě aktualizace pole – objednané pro určený produkt úspěšná, ale aktualizace pro inStock pole pro produkt se nezdaří, protože číslo určený produkt neexistuje v tabulce výrobky. To má za následek selhání transakce a transakce je ignorována.
  1. V aplikaci Visual Studio .NET nebo Visual Studio 2005, přejděte na Nový
    Nabídka soubor a klepněte na příkaz projekt.
  2. Klepněte na položku Visual C# projekty ve skupinovém rámečku
    Typy projektůa potom klepněte na tlačítko Aplikace konzoly v části šablony.

    Poznámka: V aplikaci Visual Studio 2005 klepněte Visual C# ve skupinovém rámečku
    Typy projektůa potom klepněte na tlačítko Aplikace konzoly v části šablony.
  3. Do textového pole název zadejte
    varlat. Ujistěte se, zda je vybrána možnost Přidat do řešení .
  4. Klepněte na tlačítko OK přidáte tento projekt do řešení.
  5. Pro varlat otestovat clsESmusíte přidat odkaz. V Průzkumníku řešení klikněte pravým tlačítkem myši
    Odkazy v rámci varlat (nově přidaného) a potom klepněte na tlačítko Přidat odkaz.
  6. Zobrazí se dialogové okno Přidat odkaz . Na kartě projekty poklepejte
    prjEnterprise.
  7. Odkaz se zobrazí v seznamu Vybrané součásti. Klepněte na tlačítko OK přidejte tento odkaz na projekt.
  8. Přidáte odkaz na projekt knihovny služby System.EnterpriseServices. V Průzkumníku řešení klikněte pravým tlačítkem myši
    Odkazya potom klepněte na tlačítko Přidat odkaz
    .
  9. Zobrazí se dialogové okno Přidat odkaz . V části Název součásti na kartě .NET poklepejte na služby System.EnterpriseServices.
  10. Ujistěte se, že služby System.EnterpriseServicesse zobrazí v seznamu Vybrané součásti. Klepněte na tlačítko OK
  11. Klepněte pravým tlačítkem myši aplikace konzoly (varlata) a klepněte na tlačítko nastavit jako projekt při spuštění
  12. Vložte následující zdrojový kód v hlavní funkce třídy 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. 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 produktu jsou v tabulce výrobky. Aktualizaci pole – objednané pro produkt 1 777, chcete-li a inStock pole pro produkt 2 je aktualizován 888. Protože tato transakce proběhla úspěšně, zobrazí následující zpráva v okně Výstup
    ÚSPĚCH JEDNOHO - TRANSAKCE


    Druhé volání dbAccess selže. Proto ani aktualizační příkaz v dbAccess tabulky produkty je zaúčtována do databáze. Ačkoli produktu 1 by mohl jeho – objednané pole aktualizována 5, produkt 2 nemůže mít jeho inStock pole nastavit na -20. Omezení, který je definován v definici tabulky produktů inStock není povoleno mít záporná čísla.

    Proto toto volání dbAccess selže a celá transakce nezdaří. V tabulce výrobky zůstane jako bylo před volání dbAccess. Příkaz zachytit zpracovává oznámení o selhání transakce z dbAccessa zobrazí následující chybová zpráva v okně výstup:
    SELHÁNÍ TRANSAKCE
  14. Zkontrolujte obsah tabulky výrobky Northwind pomocí SQL Server Enterprise Manager. Při zobrazení produktu 1 se rovná 777 – objednané pole. Při zobrazení produktu 2 instock 888 je pole. Proto se nezdaří druhé volání dbAccess (které by měly za následek různé hodnoty pro tato pole).
zpět na horní

Poradce při potížích

  • Ujistěte se, že jakýkoli projekt, který používá služby COM + má silný název.
  • Jakákoliv třída, která používá služby COM + musí dědit z servisu součásti. Obsluhované komponenty je umístěn v oboru názvů služby System.EnterpriseServices .
  • Při ladění, může transakce časový limit před je potvrzena nebo přerušena. Nechcete-li časový limit, použijte vlastnost časový limit atribut transakce. V následujícím příkladu má související metodu 1 200 sekund k dokončení jakékoli transakce časový limit:
    [Transaction(TransactionOption.Required,timeout=1200)]
zpět na horní

Odkazy

Další informace naleznete na následujících webech Microsoft Developer Network (MSDN):
COM + Integration: Jak vám může pomoci .NET Enterprise Services sestavení distribuovaných aplikací
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
zpět na horní
Vlastnosti

ID článku: 816141 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor