Gewusst wie: Ausführen eine verteilte Transaktion mit einer .NET-Provider in Visual c# .NET mithilfe von ServicedComponent

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316247 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

In diesem Artikel veranschaulicht eine verteilte Transaktion mithilfe von einem mit der ServicedComponent -Klasse durchführen. Obwohl den .NET SqlClient-Anbieter für einen Microsoft SQL Server-Server in diesem Artikel verwendet wird, können Sie auch den ODBC oder OLE DB .NET managed Provider.

Voraussetzungen

Die folgende Liste führt die empfohlene Hardware, Software, Netzwerkinfrastruktur und Service Packs, die erforderlich sind:
  • Microsoft Windows 2000 Professional, Windows 2000 Server Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 oder Microsoft SQL Server 2000

(Übersicht)

Instanzen einer .NET Framework-Klasse können einer automatischen Transaktion teilnehmen, wenn Sie die Klasse dazu vorbereiten. Jede Ressource, die auf eine Klasseninstanz oder ein Objekt zugreift, trägt in der Transaktion. Wenn z. B. ein Objekt ADO.NET verwendet, um Geld auf ein Konto in einer Datenbank zu buchen, bestimmt der Ressourcen-Manager für die Datenbank, ob das Objekt in einer Transaktion ausgeführt wird. Wenn das Objekt in einer Transaktion ausgeführt werden soll, trägt der Ressourcen-Manager automatisch die Datenbank in die Transaktion.

Verwenden Sie den folgenden Prozess zum Vorbereiten einer Klasse zu einer automatischen Buchung teilnehmen:
  1. Gelten Sie die TransactionAttribute -Klasse für die Klasse den automatischen Transaktion-Typ angeben, den die Komponente anfordert.

    Die Buchungsart muss Mitglied der TransactionOption -Enumeration sein.
  2. Die Klasse von der ServicedComponent -Klasse ableiten. ServicedComponent ist die Basisklasse aller Klassen, die COM+-Dienste verwenden.
  3. Signieren der Assembly mit einem starken Namen, um sicherzustellen, dass die Assembly einen eindeutigen Schlüsselpaar enthält.
  4. Registrieren der Assembly, die die Klasse mit COM+-Katalog enthält.

    Hinweis : Wenn der Client, der eine Instanz der Klasse aufruft von der common Language Runtime verwaltet wird, wird die Registrierung für Sie ausgeführt. Diese Schritt ist erforderlich, nur wenn ein nicht verwalteter Aufrufer erstellt und Instanzen Ihrer Klasse aufruft. Verwenden Sie .NET Services Installation Tool (Regsvcs.exe), um die Assembly manuell zu registrieren.
Weitere Informationen zum Signieren einer Assembly mit einem starken Namen finden Sie unter das folgende Thema in Microsoft .NET Framework-Entwicklerhandbuch:
Signieren einer Assembly mit starkem Namen
http://msdn.microsoft.com/en-us/library/xc31ft41.aspx
Weitere Informationen zu diesem Prozess finden Sie unter das folgende Thema in Microsoft .NET Framework-Entwicklerhandbuch:
Automatische Transaktionen und .NET Framework-Klassen
http://msdn.microsoft.com/en-us/library/ms123400.aspx

Erstellen des Projekts

  1. Schritten Sie diesen wird ein neues Konsolenanwendungsprojekt in Visual c# .NET zu erstellen:
    1. Starten Sie Visual Studio .NET.
    2. Zeigen im Menü Datei auf neu , und klicken Sie dann auf Projekt .
    3. Klicken Sie im Dialogfeld Neues Projekt klicken Sie unter Projekttypen auf Visual C#-Projekte , klicken Sie unter Vorlagen auf Konsolenanwendung , und klicken Sie dann auf OK .
    4. Benennen Sie im Projektmappen-Explorer die Datei Class1.cs DistributedTransaction.cs.
  2. Löschen Sie alle den Code aus der Datei DistributedTransaction.cs.
  3. Im Menü Projekt klicken Sie auf Verweis hinzufügen , und fügen Sie die folgenden Verweise hinzu:
    • System.EnterpriseServices
    • System.Data.dll

  4. In der Datei AssemblyInfo.cs, kommentieren Sie die folgenden Codezeilen:
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]
    					
  5. Fügen Sie den folgenden Code hinzu die Datei DistributedTransaction.cs:
    using System;
    using System.Data.SqlClient;
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;
    
    [assembly: ApplicationName("DistributedTransaction")]
    [assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]
    
    
    namespace DistributedTransaction
    {
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       class Class1
       {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          [STAThread]
          static void Main(string[] args)
          {
             try
             {
                DistributedTran myDistributedTran = new DistributedTran();
                myDistributedTran.TestDistributedTransaction();
             }
             catch (System.Data.SqlClient.SqlException e)
             {
                System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);
             }         
          }
       }
       /// <summary>
       /// Summary description for TestApp.
       /// </summary>
       [Transaction(TransactionOption.Required)]
       public class DistributedTran: ServicedComponent 
       {
          public DistributedTran()
          {
          }
          [AutoComplete]
          public string TestDistributedTransaction()
          {
             // The following Insert statement goes to the first server.
             // This Insert statement does not produce any errors. 
             String insertCmdSql = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')";
    
             // The following Delete statement goes to the second server.
             // Because the table does not exist, this code throws an exception.
             String exceptionCausingCmdSQL = "Delete from NonExistentTable";
                         
             // The following connection strings create instances of two SqlConnection objects
             // to connect to two different SQL Server servers in your environment.
             // Modify the connection strings as necessary for your environment.
             SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
             SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
    
             try
             {
                SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);
                SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);
       
                // This command runs properly.
                insertCmd.Connection.Open();
                insertCmd.ExecuteNonQuery();
    
    
                // This command results in an exception, which automatically rolls back
                // the first command (the insertCmd command).
                exceptionCausingCmd.Connection.Open();
                int cmdResult = exceptionCausingCmd.ExecuteNonQuery();
                
                SqlConn1.Close();
                SqlConn2.Close();
    
                Console.WriteLine("Hello");
                
             }
             catch (System.Data.SqlClient.SqlException ex)
             {
                // After you catch the exception in this function, throw it. 
                // The service component receives this exception and 
                // aborts the transaction. The service component then
                // throws the same exception, and the calling function
                // receives the error message.
                Console.WriteLine (ex.Message);
                throw (ex);
             }
             finally 
             {
                // Close the connection.
                if (SqlConn1.State.ToString() == "Open")
                   SqlConn1.Close();
    
                if (SqlConn2.State.ToString() == "Open")
                   SqlConn2.Close();
             }
    
             return "Success";
           
          }
    
       }
    }
    					
  6. Klicken Sie im Menü Datei auf Alle speichern .
  7. Klicken Sie auf Start , zeigen Sie auf Programme , zeigen Sie auf Microsoft Visual Studio .NET , zeigen Sie auf Visual Studio .NET Tools und klicken Sie dann auf Visual Studio .NET-Eingabeaufforderung .
  8. Öffnen Sie den Ordner, der das Projekt enthält, und führen Sie folgenden Befehl zum Signieren der Assembly mit einem starken Namen:
    sn-k DistributedTransaction.snk
  9. Erstellen Sie Ihre Anwendung.
  10. Erstellen Sie die folgende Tabelle in der ersten SQL Server:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TestTransaction]
    GO
    
    CREATE TABLE [dbo].[TestTransaction] (
    	[Col1] [int] NULL ,
    	[Col2] [varchar] (100) NULL 
    ) ON [PRIMARY]
    GO 
    					
  11. Die Anwendung auszuführen. Beachten Sie, dass Sie die folgenden Fehlermeldung erhalten (Dies ist das erwartete Verhalten):
    Transaktion abgebrochen: Fehler zurückgegeben: Ungültiger Objektname 'NonExistentTable'.
  12. Öffnen Sie SQL Server Query Analyzer, fügen Sie folgenden Code hinzu, und drücken Sie F5, um die Abfrage auszuführen:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    beachten, dass die Abfrage keinen keine Zeilen zurückgibt, da die Transaktion abgebrochen wurde.
  13. Suchen Sie folgenden Code in Ihrem Visual C#-Projekt:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    						
    und Ersetzen Sie die SQL-Anweisung durch eine gültige Abfrage, die die Transaktion abgebrochen keinen verursacht. Zum Beispiel:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
    					
  14. Drücken Sie F5, kompilieren und die Anwendung erneut auszuführen.
  15. Führen Sie erneut den Befehl aus Schritt 12 in Query Analyzer. Beachten Sie, dass die Abfrage eine Zeile, zurückgibt da die Transaktion erfolgreich abgeschlossen werden konnte.
NOTES :
  • In diesem Beispiel keine Fehlerbehandlung nicht ausgeführt.
  • SQL Server und Microsoft Distributed Transaction Coordinator (MS DTC) muss auf allen Clients und Servern ausgeführt werden.

Informationsquellen

Weitere Informationen finden Sie die Artikel der Microsoft Knowledge Base:
306296SO WIRD´S GEMACHT: Erstellen einer Dienste in Anspruch nehmenden .NET-Komponente, die Transaktionen in Visual C# .NET verwendet

Eigenschaften

Artikel-ID: 316247 - Geändert am: Donnerstag, 4. September 2003 - Version: 3.3
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Enterprise Services (included with the .NET Framework) 1.0
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
Keywords: 
kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316247 KbMtde
Maschinell übersetzter Artikel
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: 316247
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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