Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Verwendung von COM+-Transaktionen in einer Visual C#-Komponente

Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 816141
Eine Microsoft Visual Basic .NET Version dieses Artikels finden Sie unter 315707.

Inhalt

Zusammenfassung
Dieser schrittweise aufgebaute Artikel beschreibt die Verwendung COM+ (Komponentendienste) Transaktionen in einer Visual C#-Klasse. Eine Gruppe von Datenbankoperationen für die ist eine Einheit betrachtet. Entweder alle Vorgänge erfolgreich ausgeführt werden, oder wenn ein Vorgang fehlschlägt, die gesamte Transaktion schlägt fehl. Im letzteren Fall werden alle Datenbankoperationen, die versucht haben, wurden nicht in der zugrunde liegenden Datenbank gebucht.

back to the top

Voraussetzungen

Im folgenden werden die empfohlene Hardware, Software, Netzwerkinfrastruktur, Fähigkeiten und Kenntnisse und Servicepacks, die Sie benötigen:
  • Microsoft Windows 2000 Server SP1
  • Microsoft Internetinformationsdienste (IIS), Version 4.0 oder höher
  • Microsoft Internet Explorer, Version 5.0, 5.5 oder 6.0
In diesem Artikel wird davon ausgegangen, dass Sie mit den folgenden vertraut sind:
  • Transaktionale Konzepte und Verarbeitung
  • Com+ (Komponentendienste)
back to the top

Com+-Transaktionsdienste

Sie können die Transaktion, die Verarbeitung mit den System.EnterpriseServices -Namespace in Microsoft .NET Framework implementieren. Zugriff auf COM+-erstellen Sie transaktionale Dienste, eine Klasse. Gehen Sie hierzu folgendermaßen vor:
  1. Starten Sie Visual Studio .NET oder Visual Studio 2005.
  2. Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt .
  3. Klicken Sie unter Projekttypen auf Visual C#-Projekte , und klicken Sie dann Klassenbibliothek unter Vorlagen auf. Benennen Sie das Projekt PrjEnterprise .

    Hinweis: Klicken Sie in Visual Studio 2005 auf Visual c# unter Projekttypen , und klicken Sie dann Klassenbibliothek unter Vorlagen auf. Benennen Sie das Projekt PrjEnterprise .
  4. Class1 wird standardmäßig erstellt.
  5. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Verweise und klicken Sie dann auf Verweis hinzufügen .
  6. Das Dialogfeld Verweis hinzufügen wird angezeigt. Doppelklicken Sie unter Komponentenname auf der Registerkarte .NET auf System.EnterpriseServices .
  7. Stellen Sie sicher, dass System.EnterpriseServices unter Ausgewählte Komponenten angezeigt wird. Klicken Sie auf OK .
  8. Fügen Sie folgenden Code vor anderen Anweisungen in der Datei Class1.cs:
    using System.EnterpriseServices;using System.Data.SqlClient;
  9. Fügen Sie eine neue Klasse mit dem Namen ClsES in die Datei Class1.cs.
  10. Um COM+ Transaktions-Dienste verwenden, Ihre Klasse ( ClsES ) muss erbt die Funktionalität ServicedComponent wie folgt:
    public class clsES : ServicedComponent
  11. Ein Transaction -Attribut wird verwendet, um die Ebene der Transaktionsunterstützung für die Klasse anzugeben, die wie folgt:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Erstellen Sie eine Methode in der ClsES -Klasse, und nennen Sie DbAccess , die vier input ganzzahligen Parameter empfängt. Die ersten beiden Parameter stellen eine Produkt-ID und die Einheiten für Auftrag für das Produkt. Die zweiten beiden Parameter stellen eine Produkt-ID und vorrätigen Einheiten für das Produkt. Diese Methode führt eine Reihe von Datenbankoperationen gegen diese angegebene Produkt-IDs, die als eine Transaktion behandelt werden:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. Erstellen Sie in der DbAccess -Methode, ein SQL-Verbindungsobjekt für die Northwind-Datenbank und öffnen Sie die Verbindung. Datenbankoperationen auftreten mithilfe der folgenden Datenbank:

    Hinweis: Denken Sie daran, die folgenden Parameter für Verbindungszeichenfolgen die richtigen Werte für die SQL Server-Server entsprechend ändern.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");				Conn.Open();
  14. Legen Sie einen try -Block um alle Ausnahmen erfassen, die während der Datenbank auftreten. Sie müssen diese Ausnahmen die Transaktion abbricht, abfangen. Der try -Block umfasst zwei Datenbankoperationen. Jeder Vorgang aktualisiert ein anderes Feld in einer angegebenen Produkte Tabelle Datensatz
     try { 
  15. Führen Sie die erste Aktualisierung der Tabelle Products. Aktualisieren Sie das UnitsonOrder -Feld mit der OnOrder -Wert für das Produkt mit ID in die ersten beiden Eingabeparameter angegeben. Verwenden Sie den folgenden SQL-Befehl zum Ausführen dieses SQL-Updates:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);				sqlCommand.ExecuteNonQuery();
  16. Führen Sie ein anderes Update in der Produkttabelle. Aktualisieren Sie das EinheitenAufLager Feld mit den inStock Wert für das Produkt mit ID in die dritte und vierte Eingabeparameter angegeben. Verwenden Sie den folgenden SQL-Befehl zum Ausführen dieses SQL-Updates:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;				sqlCommand.ExecuteNonQuery();
  17. Da diese Updates Teil einer COM+-Transaktion sind, sind Sie als Einheit ein Commit ausgeführt. Die SetComplete-Methode -Methode der ContextUtil -Klasse aus den System.EnterpriseServices -Namespace wird verwendet, um die Transaktion (in diesem Fall die beiden aktualisiert) Wenn kein Fehler ausgelöst wurden:
    ContextUtil.SetComplete();
  18. Die Verbindung zur Northwind-Datenbank wird geschlossen:
    Conn.Close();}
  19. Sie müssen alle Ausnahmen, die auftreten, während die SQL-Befehle ausgeführt, so, dass Sie die gesamte Transaktion abbrechen können abfangen:
    catch(Exception e){ 
  20. Die SetAbort -Methode der ContextUtil -Klasse aus den System.EnterpriseServices -Namespace wird verwendet, um die gesamte Transaktion abgebrochen. Wenn das erste Update erfolgreich ist, und das zweite Update fehlschlägt, wird keine Aktualisierung der Tabelle Products gebucht. Der aufgefangene Ausnahme, die Aufrufer, dass die Transaktion fehlgeschlagen ist:
    ContextUtil.SetAbort();				throw e;}
  21. Für diese Komponente ordnungsgemäß funktioniert muss die Komponente einen starken Namen verfügen. Generieren eines starken Namens, und melden Sie sich die Assembly mit starkem Namen. Gehen Sie hierzu folgendermaßen vor:
    1. Geben Sie sn.exe-k snEnterprise.snk eine wichtige Datei zu erstellen, an der Visual Studio .NET-Eingabeaufforderung. Weitere Informationen zum Signieren von Assemblys mit starken Namen finden Sie unter .NET Framework SDK-Dokumentation.
    2. Kopieren Sie snEnterprise.snk in den Projektordner.
    3. Fügen Sie in AssemblyInfo.vc, die folgende Codezeile vor oder hinter anderen Anweisungen Assembly-Attribut:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Speichern Sie und erstellen Sie das Projekt.
back to the top

Vollständige Codeauflistung

Hinweis: 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			{			}		}	}	}

back to the top

Funktionsprüfung

Um diesen Code zu testen, erstellen Sie eine Konsolenanwendung, die das ClsES-Projekt verwendet. In einem Fall eine Transaktion erfolgreich ist, und die Onorder und instock Felder für das angegebene Produkt aktualisiert werden. Im zweiten Fall das Update für das Feld OnOrder für eine angegebene Produkt erfolgreich, aber das Update für die inStock Feld für ein Produkt fehlschlägt, weil die angegebene Produktnummer nicht in der Tabelle Artikel vorhanden ist. Dies führt zu einem Transaktionsfehler und die Transaktion ignoriert.
  1. Zeigen Sie in Visual Studio .NET oder Visual Studio 2005 im Menü Datei auf neu , und klicken Sie dann auf Projekt .
  2. Klicken Sie unter Projekttypen auf Visual C#-Projekte , und klicken Sie dann unter Vorlagen auf Konsolenanwendung .

    Hinweis: Klicken Sie in Visual Studio 2005 auf Visual c# unter Projekttypen , und klicken Sie dann unter Vorlagen auf Konsolenanwendung .
  3. Geben Sie im Textfeld Name testES ein. Stellen Sie sicher, dass die Option zu Projektmappe hinzufügen aktiviert ist.
  4. Klicken Sie auf OK , um dieses Projekt zur Projektmappe hinzuzufügen.
  5. Für testES , ClsES zu testen müssen Sie einen Verweis hinzufügen. Klicken Sie im Projektmappen-Explorer unter testES (, die Sie gerade hinzugefügt) mit der rechten Maustaste auf Verweise , und klicken Sie dann auf Verweis hinzufügen .
  6. Das Dialogfeld Verweis hinzufügen wird angezeigt. Doppelklicken Sie auf der Registerkarte Projekte auf PrjEnterprise .
  7. Ein Verweis wird unter Ausgewählte Komponenten . Klicken Sie auf OK , um diesen Verweis zum Projekt hinzuzufügen.
  8. Fügen Sie einen Verweis auf das Projekt zu den System.EnterpriseServices-Bibliothek. Klicken Sie in Projektmappen-Explorer mit der rechten Maustaste auf Verweise und klicken Sie dann auf Verweis hinzufügen .
  9. Das Dialogfeld Verweis hinzufügen wird angezeigt. Doppelklicken Sie unter Komponentenname auf der Registerkarte .NET auf System.EnterpriseServices .
  10. Stellen Sie sicher, dass System.EnterpriseServices unter Ausgewählte Komponenten angezeigt wird. Klicken Sie auf OK .
  11. Klicken Sie mit der rechten Maustaste auf die Konsolenanwendung ( testES ), und klicken Sie dann auf als Startprojekt festlegen
  12. Fügen Sie den folgenden Quellcode in der Main -Funktion der Klasse 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. Drücken Sie F5, um den Testcode ausführen.

    Im Code in Schritt 7 erfolgreich der erste Aufruf von DbAccess . Produkt 1 und 2 Produkt sind in der Tabelle Artikel. Das Feld OnOrder für Produkt 1 wird aktualisiert, um 777, und die inStock Feld für Produkt 2 um 888 aktualisiert wird. Da diese Transaktion erfolgreich war, Meldung Sie die folgende im Ausgabefenster
    TRANSAKTION EINE - ERFOLG


    Der zweite Aufruf von DbAccess fehlschlägt. Daher wird keine Update-Anweisung in DbAccess der Products-Tabelle der Datenbank gebucht. Obwohl Product 1 konnte das OnOrder -Feld 5 aktualisiert haben, Produkt 2 keinen seine inStock -20 festgelegt. Wegen einer Einschränkung, die in der Tabellendefinition Product definiert ist, inStock ist nicht zulässig, negative Zahlen haben.

    Daher DbAccess dieser Aufruf schlägt fehl, und die gesamte Transaktion schlägt fehl. Die Tabelle Artikel bleibt galt, bevor der Aufruf von DbAccess . Die catch -Anweisung verarbeitet Benachrichtigung Transaktionsfehler von DbAccess , und Sie erhalten folgende Fehlermeldung in das Ausgabefenster:
    TRANSAKTIONSFEHLER
  14. Untersuchen Sie den Inhalt der Northwind Products-Tabelle mithilfe von SQL Server Enterprise Manager. Wenn Sie Produkt 1 anzeigen, ist das Feld OnOrder 777 gleich. Beim Anzeigen von Produkt 2 die instock Feld 888 ist. Daher schlägt fehl, der zweite Aufruf von DbAccess (die verschiedenen Werte für diese Felder geführt hätte).
back to the top

Problembehandlung

  • Stellen Sie sicher, dass jedes Projekt, das COM+-Dienste verwendet einen starken Namen verfügt.
  • Jede Klasse, die COM+-Dienste verwendet, muss von der serviced Component erben. Die serviced Component befindet sich im System.EnterpriseServices -Namespace.
  • Während des Debuggens kann eine Transaktion Zeitlimit überschritten wurde vor dem zugesichert oder abgebrochen wird. Um einen Timeout zu vermeiden, verwenden Sie eine Timeout-Eigenschaft für das Transaktionsattribut. In der folgenden Beispiel verfügt die zugeordnete Methode 1.200 Sekunden, um eine Transaktion abschließen, bevor es Timeout:
    [Transaction(TransactionOption.Required,timeout=1200)]
back to the top
Informationsquellen
Weitere Informationen finden Sie auf den folgenden Websites von Microsoft Developer Network (MSDN):
COM+ Integration: How .NET Enterprise Services Can Help You Build Distributed Applications
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
back to the top

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 816141 – Letzte Überarbeitung: 11/22/2007 08:17:35 – Revision: 4.3

Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 KbMtde
Feedback