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

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 316627 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
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, Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 oder SQLServer 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. Zum Beispiel:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  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/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Weitere Informationen zu diesem Prozess finden Sie unter folgende Thema in .NET Framework-Entwicklerhandbuch:
Automatische Transaktionen und .NET Framework-Klassen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

Erstellen des Projekts

  1. Gehen Sie folgendermaßen um ein neues Konsolenanwendungsprojekt in Visual Basic .NET zu erstellen vor:
    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 Basic-Projekte , klicken Sie unter Vorlagen auf Konsolenanwendung und klicken Sie dann auf OK .
    4. Benennen Sie im Projektmappen-Explorer die Datei Module1.vb DistributedTransaction.vb.
  2. Löschen Sie alle den Code aus der Datei DistributedTransaction.vb.
  3. Im Menü Projekt klicken Sie auf Verweis hinzufügen , und fügen Sie die folgenden Verweise hinzu:
    • System.EnterpriseServices
    • System.Data.dll

  4. Fügen Sie den folgenden Code hinzu die Datei DistributedTransaction.vb:
    Imports System
    Imports System.Data.SqlClient
    Imports System.EnterpriseServices
    Imports System.Runtime.CompilerServices
    Imports System.Reflection
    
    <Assembly: ApplicationName("DistributedTransaction")> 
    <Assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")> 
    
    
    Namespace DistributedTransaction
    
        '<summary>
        'Summary description for Class1.
        '</summary>
        Module Module1
            '<summary>
            'The main entry point for the application.
            '</summary>
            <STAThread()> Sub Main()
                Try
                    Dim myDistributedTran As New DistributedTran()
                    myDistributedTran.TestDistributedTransaction()
                Catch e As System.Data.SqlClient.SqlException
                    System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message)
                End Try
            End Sub
        End Module
    
        '<summary>
        'Summary description for TestApp.
        '</summary>
        <Transaction(TransactionOption.Required)> Public Class DistributedTran
            Inherits ServicedComponent
    
            Public Sub DistributedTran()
            End Sub
    
            <AutoComplete()> Public Function TestDistributedTransaction() As String
    
    
                'The following Insert statement goes to the first server.
                'This Insert statement does not produce any errors. 
                Dim insertCmdSql As String = "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. 
                Dim exceptionCausingCmdSQL As String = "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.
                Dim SqlConn1 As New SqlConnection("Server=Name_of_Server1;uid=User_Id;database=DatabaseName;pwd=Password")
                Dim SqlConn2 As New SqlConnection("Server=Name_of_Server2;uid=User_Id;database=DatabaseName;pwd=Password")
    
                Try
                    Dim insertCmd As New SqlCommand(insertCmdSql, SqlConn1)
                    Dim exceptionCausingCmd As New SqlCommand(exceptionCausingCmdSQL, SqlConn2)
    
                    'This command should run 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()
                    Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()
    
                    SqlConn1.Close()
                    SqlConn2.Close()
    
                    Console.WriteLine("Hello")
    
                Catch ex As System.Data.SqlClient.SqlException
    
                    '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" Then
                        SqlConn1.Close()
                    End If
    
                    If SqlConn2.State.ToString() = "Open" Then
                        SqlConn2.Close()
                    End If
    
                End Try
    
                Return "Success"
    
            End Function
    
        End Class
    End Namespace 
    					
  5. Klicken Sie im Menü Datei auf Alle speichern .
  6. 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 .
  7. Ö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
  8. Erstellen Sie Ihre Anwendung.
  9. 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 
    					
  10. 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'.
  11. Ö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.
  12. Suchen Sie den folgenden Code in Ihre Visual Basic-Projekt:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    und Ersetzen Sie die SQL-Anweisung durch eine gültige Abfrage, die die Transaktion abgebrochen keinen verursacht. Zum Beispiel:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Drücken Sie F5, kompilieren und die Anwendung erneut auszuführen.
  14. Führen Sie erneut den Befehl aus Schritt 11 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:
312902Gewusst wie: Erstellen eine .NET Serviced Component in Visual Basic .NET

Eigenschaften

Artikel-ID: 316627 - Geändert am: Montag, 24. Februar 2014 - Version: 2.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft .NET Framework Service Pack 2
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Keywords: 
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 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: 316627
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