Verwendung von COM+-Transaktionen in einer Komponente mit Visual Basic .NET

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

Auf dieser Seite

Zusammenfassung

Dieser Artikel enthält eine schrittweise die Verwendung von COM+ veranschaulicht (Component Services) Transaktionen in einer Visual Basic .NET-Klasse. Eine Gruppe von Datenbankoperationen für die wird als eine Einheit betrachtet. Die Vorgänge entweder alle erfolgreich ausgeführt werden, oder, wenn ein Vorgang fehlschlägt, die gesamte Transaktion schlägt fehl. Im letzteren Fall werden alle Datenbankoperationen, die unternommen wurden nicht auf die zugrunde liegende Datenbank gebucht.

Voraussetzungen

Im folgenden werden empfohlene Hardware, Software, Netzwerkinfrastruktur, Fähigkeiten und Kenntnisse und Servicepacks:
  • Microsoft Windows 2000 Server mit SP-1
  • Microsoft Internetinformationsdienste (IIS), Version 4.0 oder höher
  • Microsoft Internet Explorer, Version 5.0, 5.5 oder 6.0
Erforderliches Vorwissen:
  • Kenntnisse der Transaktionsreplikation Konzepte und Verarbeitung
  • Vertrautheit mit COM+ (Komponentendienste)

Transaktionale COM+-Dienste

System.EnterpriseServices -Namespace innerhalb der Microsoft .NET Framework bietet Funktionen zum Implementieren der Transaktionsverarbeitung. Zugriff COM+-Transaktionen Dienste, erstellen eine Klasse mithilfe der folgenden Schritte:
  1. Öffnen Sie Visual Studio .NET.
  2. Erstellen Sie ein neue Klasse Bibliothek-Projekt mit dem Namen PrjEnterprise in Visual Basic .NET. Visual Basic .NET erstellt eine öffentliche Klasse mit der Bezeichnung Class1.
  3. Fügen Sie einen Verweis auf das Projekt zu den System.EnterpriseServices-Bibliothek. Klicken Sie im Projektmappen-Explorer klicken Sie mit der rechten Maustaste auf den Ordner Verweise und wählen Sie Verweis hinzufügen aus dem Kontextmenü. Blättern Sie auf der Registerkarte .NET , bis Sie System.EnterpriseServices gefunden haben. Doppelklicken Sie auf System.EnterpriseServices , stellen Sie sicher, dass System.EnterpriseServices im Fenster ausgewählte Komponenten angezeigt wird, und klicken Sie dann auf OK .
  4. Verwenden Sie die Imports -Anweisung für den System.EntpriseServices -Namespace und der System.Data.SqlClient -Namespace, sodass Sie keine Verweise auf diesen Namespaces später im Code vollständig zu qualifizieren müssen. Diese Anweisungen müssen vor allen anderen Anweisungen in der Klassendatei scheinbar:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Um COM+-Transaktionen Services verwenden, muss Ihre Klasse, mit dem Namen ClsES, Funktionalität von ServicedComponent erben:
    	Public Class clsES
    Inherits ServicedComponent
  6. Ein Transaction -Attribut wird verwendet, um die Ebene der Transaktionsunterstützung für die Klasse anzugeben:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Erstellen Sie eine Methode in ClsES, DbAccess , die empfängt vier Eingaben Ganzzahl-Parameter aufgerufen. Die ersten beiden Parameter bieten eine Produkt-ID und die Einheiten für Auftrag für das Produkt. Die zweiten beiden Parameter bieten 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:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. Erstellen Sie in der DbAccess -Methode, ein SQL-Verbindungsobjekt für die Northwind-Datenbank und öffnen Sie die Verbindung. Datenbankoperationen stattfinden mithilfe dieser Datenbank:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Legen Sie einen Try-Block um Verarbeitungen Datenbank erfassen, die auftreten können. Diese Fehler müssen abgefangen werden, um die Transaktion abgebrochen werden können. Try-Block enthalten zwei Datenbankoperationen, jeweils ein anderes Feld in einem angegebenen Produkte-Tabelle-Datensatz aktualisieren.
    		Try
  10. Führen Sie die erste Aktualisierung der Tabelle Products. Aktualisieren Sie das UnitsonOrder -Feld mit dem Wert der OnOrder für das Produkt mit ID in die ersten beiden Eingabeparameter angegeben. Eine SQLcommand zum Ausführen von diesem Updates SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. Führen Sie ein anderes Update in der Produkttabelle. Aktualisieren Sie das EinheitenAufLager -Feld mit dem Wert der inStock für das Produkt mit ID in die dritte und vierte Eingabeparameter angegeben. Ein SQLCommand zum Ausführen von diesem Updates SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. 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 commit der Transaktion--in diesem Fall zwei Updates--Wenn keine Fehler ausgelöst wurden:
          ContextUtil.SetComplete()
  13. Die Verbindung zur Northwind-Datenbank wird geschlossen:
          Conn.Close()
  14. Beim Ausführen der SQL-Befehle auftretende Fehler müssen abgefangen werden, so dass die gesamte Transaktion abgebrochen werden kann:
    	   Catch e As Exception
  15. 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
    		End Try
  16. Damit diese Komponente ordnungsgemäß funktioniert muss die Komponente einen starken Namen haben. Gehen Sie folgendermaßen vor um einen starken Namen zu generieren und zum Signieren der Assembly mit dem starken Namen:

    1. Eine Visual Studio .NET-Eingabeaufforderung öffnen, klicken Sie auf Start , klicken Sie auf Programme , klicken Sie auf Microsoft Visual Studio .NET, und klicken Sie dann auf Visual Studio .NET Tools .
    2. Geben Sie an der Eingabeaufforderung sn.exe-k snEnterprise.snk Ihrer Assembly einen starken Namen zu geben.

      Weitere Informationen zum Signieren von Assemblys mit starken Namen finden Sie in der .NET Framework SDK-Dokumentation.
    3. Kopieren Sie snEnterprise.snk in den Projektordner.
    4. Fügen Sie in der Datei AssemblyInfo.vb, die folgende Zeile des Codes vor oder hinter anderen Anweisungen Assembly-Attribut:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Speichern und das Projekt erstellen.

Vollständige Codeauflistung

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

Funktionsprüfung

Um diesen Code zu testen, erstellen Sie eine Konsolenanwendung, die ClsES 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 schlägt fehl, da die angegebene Produktnummer nicht in der Tabelle Artikel vorhanden ist. Dadurch eine Transaktion fehlschlägt, mit der Transaktion ignoriert.
  1. Fügen Sie eine neue Konsolenanwendung mit dem Namen testES zu Ihrer Lösung hinzu, sodass die Projektmappe das Projekt testES und PrjEnterprise-Projekt enthält. Um das neue Projekt hinzuzufügen, klicken Sie im Menü Datei auf neu , und wählen Sie dann Projekt .
  2. Ein Dialogfeld Neues Projekt wird angezeigt. Wählen Sie den Visual Basic-Ordner im Projekt Typen Bereich und wählen Sie dann Konsolenanwendung aus den Vorlagen. Geben Sie im Feld Name im Bereich Vorlagen testES , also den Namen des Projekts, ein. Stellen Sie sicher, dass die Schaltfläche zu Projektmappe hinzufügen , die am unteren Rand des Dialogfelds angezeigt wird ausgewählt ist. Klicken Sie auf OK , um dieses Projekt zur Projektmappe hinzuzufügen.
  3. Damit testES, ClsES zu testen müssen Sie einen Verweis hinzufügen. Klicken Sie im den Fenster Lösungen mit der Maustaste im Ordner Verweise , der unter testES Projekt stehen dem soeben hinzugefügten auf. Wählen Sie Verweis hinzufügen . Ein Dialogfeld Verweis hinzufügen wird angezeigt.
  4. Wählen Sie die Registerkarte Projekte , und doppelklicken Sie dann auf PrjEnterprise . Ein Verweis sollte in Ausgewählte Komponenten im unteren Teil des Dialogfelds angezeigt. Klicken Sie auf OK , um diesen Verweis zum Projekt hinzuzufügen.
  5. Klicken Sie mit der rechten Maustaste auf die Konsolenanwendung testES , und wählen Sie als Startup Project .
  6. Wählen Sie im Debuggen von Windows . Aktivieren Sie im Untermenü direkt . Dadurch wird sichergestellt, dass im Direktfenster anzeigen.
  7. Kopieren Sie den folgenden Testcode in Module Module1 ersetzen die Anweisungen Sub Main und End Sub. Das Modul sollte wie folgt angezeigt:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. Drücken Sie F5, um den Testcode ausführen.
  9. Im Code in Schritt 7 erfolgreich der erste Aufruf von DbAccess. Ein Produkt 1 und ein Produkt 2 befinden sich 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, sollten im Direktfenster die Meldung "TRANSACTION ONE - erfolgreich" angezeigt.

    Der zweite Aufruf von DbAccess fehlschlägt. Daher weder eine Tabelle wird der Update-Anweisungen in DbAccess zu den Produkten in der Datenbank gebucht. Obwohl Produkt 1 das OnOrder -Feld aktualisiert, um 5 haben konnte, Produkt 2 keinen seine inStock -20 festgelegt. Wegen einer Einschränkung, die in der Tabellendefinition Product definiert ist inStock darf keine negative Zahlen haben.

    Folglich fehl dieser Aufruf DbAccess, wodurch die gesamte Transaktion fehlschlägt. Die Tabelle Artikel bleibt galt, bevor der Aufruf von DbAccess. Die catch -Anweisung verarbeitet Benachrichtigung Transaktionsfehler von DbAccess, wodurch sich die Meldung "TRANSACTION FAILURE" im benachbarten Fenster angezeigt wird.
Untersuchen Sie den Inhalt der Northwind Products-Tabelle mithilfe von SQL Server Enterprise Manager. Beim Anzeigen von Produkt 1 das OnOrder -Feld ist gleich zu 777; für Produkt 2, die instock Feld 888 ist. Daher verfügt der zweite Aufruf DbAccess, die unterschiedliche Werte für diese Felder geführt hätte ist fehlgeschlagen.

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 sich in den System.EnterpriseServices -Namespace befindet.
  • 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. Im folgenden Ruft die zugeordnete Methode 1.200 Sekunden auf eine Transaktion abschließen, bevor es Timeout:
    <Transaction(TransactionOption.Required, timeout:=1200) >

Informationsquellen

Weitere Informationen finden Sie auf den folgenden Websites von Microsoft Developer Network (MSDN):
COM+ Integration: How .NET Enterprise Services Sie Hilfe können verteilten erstellen Anwendungen
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Serviced Components
http://msdn.microsoft.com/en-us/library/aa289839.aspx

Eigenschaften

Artikel-ID: 315707 - Geändert am: Dienstag, 8. November 2005 - Version: 3.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbmt kbhowtomaster KB315707 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: 315707
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