PROCEDURE: Uitvoeren van een gedistribueerde transactie met een.NETTO-Provider via ServicedComponent in Visual Basic.NETTO

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 316627 - Bekijk de producten waarop dit artikel van toepassing is.
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Samenvatting

In dit artikel ziet u hoe een gedistribueerde transactie uitvoeren met behulp van een.NETTO-provider met hetServicedComponentklasse. Hoewel dit artikel maakt gebruik van de SqlClient.NETTO voorziening tegen een server met Microsoft SQL Server, ook kunt u de ODBC of OLE DB.NETTO managed provider.

Vereisten

De volgende lijst bevat een overzicht van de aanbevolen hardware, software, net werk infrastructuur en service packs nodig:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server
  • Microsoft Visual Studio.NETTO
  • Microsoft SQL Server 7. 0 of SQL Server 2000

Overzicht

Exemplaren van een..NET Framework-klasse kan deel nemen aan een automatische transactie als u de klasse deze voorbereidt. Elke bron die een klasse-instantie of een object benadert stroomt in de transactie. Als bijvoorbeeld een object wordt ADO gebruikt.NETTO boeken geld op een rekening in een data base, de bronnen beheerder voor de data base bepaalt of het object in een transactie wordt uitgevoerd. Als het object moet worden uitgevoerd in een transactie, stroomt de bronnenbeheerder automatisch de data base in de transactie.

Volg de onderstaande procedure om een klasse te nemen in een automatische transactie voorbereiden:
  1. Gelden deTransactionAttributeklasse aan uw klasse het type automatische transactie waarin de component opgeven.

    Het transactie type moet lid zijn van deTransactionOptionopsomming. Bijvoorbeeld:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. Afgeleid van de klasse van deServicedComponentklasse.ServicedComponentis de basis klasse van alle klassen die COM+-services gebruiken.
  3. De assembly met een sterke naam om ervoor te zorgen dat de assembly een uniek sleutel paar bevat ondertekenen.
  4. Registreer de assembly met de klasse met de COM+-catalogus.

    OPMERKING: Als de client die een exemplaar van de klasse belt wordt beheerd door de common language runtime, wordt de registratie uitgevoerd voor u. Deze stap is alleen vereist als een onbeheerde beller maakt en exemplaren van de klasse roept. Gebruik het.NET Services Installation Tool (regsvcs. exe) handmatig registreren de assembly.
Zie het volgende onderwerp in de Microsoft voor meer informatie over het ondertekenen van een assembly met een sterke naam..NET Framework Developer's Guide:
Ondertekening van een Assembly met een sterke naam
http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/cpguide/HTML/cpconassigningassemblystrongname.ASP
Zie voor meer informatie over dit proces het volgende onderwerp in de..NET Framework Developer's Guide:
Automatische transacties en..NET Framework-klassen
http://msdn.Microsoft.com/library/default.asp?url=/library/en-us/cpguide/HTML/cpconautomatictransactionsnetframeworkclasses.ASP

Het Project maken

  1. Ga als volgt te werk om een nieuw Console toepassings project in Visual Basic maken.NET:
    1. Start Visual Studio.NET.
    2. Op deBestandhet menuNieuwe, en klik vervolgens opProject.
    3. In deNieuw Projecthet dialoog venster, klikt u opVisual Basic-projectenonderProject typen, klik opConsole toepassingonderSjablonen, en klik vervolgens opOK.
    4. In de Solution Explorer, naam van het bestand Module1.vb als DistributedTransaction.vb.
  2. Verwijder alle code uit het bestand DistributedTransaction.vb.
  3. Op deProjectmenu, klikt u opVerwijzing toevoegen, en voeg de volgende verwijzingen:
    • System
    • System.data.dll

  4. Voeg de volgende code aan het DistributedTransaction.vb bestand:
    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. Op deBestandmenu, klikt u opAlles opslaan.
  6. Klik opStart, wijsProgramma's, wijsMicrosoft Visual Studio.NETTO, wijsVisual Studio.Net werk hulp programma's, en klik vervolgens opVisual Studio.NETTO-opdrachtprompt.
  7. Open de map met het project en voer de volgende opdracht om de assembly met een sterke naam ondertekenen:
    SN -k DistributedTransaction.snk
  8. Uw toepassing maken.
  9. Maak de volgende tabel in de eerste 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. De toepassing wordt uitgevoerd. Er verschijnt het volgende foutbericht (dit is de verwachte werking):
    Transactie afgebroken: Fout geretourneerd: ongeldige object naam 'nonexistenttable'.
  11. Open SQL Server Query Analyzer, voeg de volgende code en druk op F5 als u de query wilt uitvoeren:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    Houd er rekening mee dat de query geen rijen retourneert omdat de transactie is afgebroken.
  12. Zoek de volgende code in de Visual Basic-project:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    en vervangt u de SQL-instructie met een geldige query waardoor de transactie af te breken. Bijvoorbeeld:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Druk op F5 om te compileren en de toepassing opnieuw uit te voeren.
  14. Voer de opdracht opnieuw vanaf stap 11 in Query Analyzer. U ziet dat de query resulteert in een rij omdat de transactie is voltooid.
NOTITIES:
  • In dit voorbeeld geen fout afhandeling uitgevoerd.
  • SQL Server en Microsoft Distributed Trans act ion Coordinator (MS DTC) moet worden uitgevoerd op alle clients en servers.

Referenties

Voor meer informatie klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
312902PROCEDURE: Een service maken.NETTO Component in Visual Basic.NETTO

Eigenschappen

Artikel ID: 316627 - Laatste beoordeling: maandag 24 februari 2014 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Trefwoorden: 
kbnosurvey kbarchive kbcompiler kbhowtomaster kbsqlclient kbsystemdata kbmt KB316627 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:316627

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