HOW TO: Eseguire una transazione distribuita con un provider .NET utilizzando ServicedComponent in Visual Basic .NET

Traduzione articoli Traduzione articoli
Identificativo articolo: 316627 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato archiviato. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

In questo articolo viene illustrato come eseguire una transazione distribuita tramite un provider .NET la classe ServicedComponent . In questo articolo utilizza il provider di SqlClient .NET su un server di Microsoft SQL Server, è possibile utilizzare il provider ODBC o OLE DB .NET gestito.

Requisiti

Nell'elenco seguente sono indicati hardware, software, infrastruttura di rete e i service pack necessari:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 o SQL Server 2000

Cenni preliminari

Le istanze di una classe .NET Framework possono partecipare a una transazione automatica Se si prepara la classe per eseguire questa operazione. Inserisce nell'elenco ogni risorsa che accede a un'istanza della classe o un oggetto nella transazione. Ad esempio, se un oggetto utilizza ADO.NET per registrare il denaro di un account in un database, il gestore delle risorse per il database determina se l'oggetto viene eseguita in una transazione. Se l'oggetto deve essere eseguito in una transazione, il gestore delle risorse inserisce automaticamente il database nella transazione.

Per preparare una classe a partecipare a una transazione automatica, utilizzare la seguente procedura:
  1. Applicare la classe TransactionAttribute la classe per specificare che il componente richiede il tipo di transazione automatica.

    Il tipo di transazione deve appartenere dell'enumerazione TransactionOption . Ad esempio:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. Derivare la classe dalla classe ServicedComponent . ServicedComponent è la classe base di tutte le classi che utilizzano servizi COM +.
  3. Firmare l'assembly con un nome sicuro per assicurarsi che l'assembly contiene una coppia di chiavi univoca.
  4. Registrare l'assembly che contiene la classe con il catalogo.

    Nota : se il client che chiama un'istanza della classe è gestito da common language runtime, la registrazione viene eseguita automaticamente. Questo passaggio è obbligatorio in solo se un chiamante non gestito crea e chiama le istanze della classe. Utilizzare lo strumento di installazione di servizi di .NET (Regsvcs.exe) per registrare manualmente l'assembly.
Per ulteriori informazioni su come firmare un assembly con un nome sicuro, vedere l'argomento riportato di seguito nella Guida gli sviluppatori di Microsoft .NET Framework:
La firma di un assembly con nome sicuro
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Per ulteriori informazioni su questo processo, vedere l'argomento riportato di seguito nella Guida gli sviluppatori di .NET Framework:
Transazioni automatiche e classi .NET Framework
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

Creazione del progetto

  1. Attenersi alla seguente procedura per creare un nuovo progetto applicazione console in Visual Basic. NET:
    1. Avviare Visual Studio NET..
    2. Scegliere Nuovo dal menu file , quindi progetto .
    3. Nella finestra di dialogo Nuovo progetto , fare clic su Progetti di Visual Basic in Tipi progetto fare clic su Applicazione Console in modelli e quindi fare clic su OK .
    4. In Esplora soluzioni rinominare il file di Module1.vb come DistributedTransaction.vb.
  2. Eliminare tutto il codice dal file DistributedTransaction.vb.
  3. Scegliere Aggiungi riferimento dal menu progetto e aggiungere i seguenti riferimenti:
    • System.EnterpriseServices
    • System.Data.dll

  4. Aggiungere il codice riportato di seguito al file 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. Scegliere Salva tutto dal menu file .
  6. Fare clic su Start , scegliere programmi , scegliere Microsoft Visual Studio. NET , Visual Studio .NET Tools , quindi prompt dei comandi di Visual Studio. NET .
  7. Aprire la cartella contenente il progetto e quindi eseguire il comando seguente per firmare l'assembly con un nome sicuro:
    DistributedTransaction.snk sn -k
  8. Creare l'applicazione.
  9. Creare la tabella riportata di seguito nel primo server di 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. Eseguire l'applicazione. Si noti che è visualizzato il seguente messaggio (che è il comportamento previsto):
    Transazione interrotta: Errore restituito: nome oggetto non valido 'NonExistentTable'.
  11. Aprire SQL Server Query Analyzer, aggiungere il codice seguente e quindi premere F5 per eseguire la query:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    nota che la query non restituisce alcuna riga perché la transazione è stata interrotta.
  12. Individuare il seguente codice nel progetto Visual Basic:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    e sostituire l'istruzione SQL con una query valida che non causi interrompere la transazione. Ad esempio:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Premere F5 per compilare ed eseguire nuovamente l'applicazione.
  14. Eseguire nuovamente il comando dal passaggio 11 in Query Analyzer. Si noti che la query restituisce una riga perché è in grado di completare la transazione.
NOTES :
  • In questo esempio non esegue la gestione degli errori.
  • Su tutti i client e server è necessario eseguire SQL Server e Microsoft Distributed Transaction Coordinator (MS DTC).

Riferimenti

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
312902Procedura: Creare un componente servito .NET in Visual Basic .NET

Proprietà

Identificativo articolo: 316627 - Ultima modifica: lunedì 24 febbraio 2014 - Revisione: 2.1
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi: 
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 316627
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

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