COMO: Efectuar uma transacção distribuída com um fornecedor de .NET utilizando ServicedComponent no Visual Basic .NET

Traduções de Artigos Traduções de Artigos
Artigo: 316627 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo demonstra como efectuar uma transacção distribuída utilizando um fornecedor de .NET com a classe de ServicedComponent . Apesar deste artigo se utilizar o fornecedor de .NET SqlClient contra um servidor de Microsoft SQL Server, também pode utilizar o fornecedor gerido ODBC ou OLE DB .NET.

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs são necessários:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 ou SQL Server 2000

Descrição geral

Instâncias de uma classe .NET Framework podem participar numa transacção automática se preparar a classe para o fazer. Cada recurso que acede a uma instância da classe ou um objecto inscreve na transacção. Por exemplo, se um objecto utiliza o ADO.NET para registar dinheiro de uma conta numa base de dados, o Gestor de recursos para a base de dados determina se o objecto é executada numa transacção. Se o objecto deve ser executada numa transacção, o Gestor de recursos inscreve automaticamente a base de dados na transacção.

Utilizar o seguinte processo para preparar uma classe para participar de uma transação automática:
  1. Aplicam-se a classe TransactionAttribute a sua classe para especificar o tipo de transacção automática pede o componente.

    A natureza da transacção tem de ser um membro de enumeração TransactionOption . Por exemplo:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. Deriva da classe da classe de ServicedComponent . ServicedComponent é a classe base de todas as classes que utilizam serviços COM +.
  3. Assine a assemblagem com um nome seguro para garantir que a assemblagem contém um par de chaves exclusivo.
  4. Registe a assemblagem que contém a classe com o catálogo do COM +.

    Nota : Se o cliente que invoca uma instância da classe é gerido pelo common language runtime, o registo é efectuado para. Este passo é necessário apenas se um autor da chamada não gerida cria e chama as instâncias da classe. Utilizam a ferramenta .NET dos serviços de instalação Tool (regsvcs.exe) para registar manualmente a assemblagem.
Para obter mais informações sobre como assinar uma assemblagem com um nome seguro, consulte o tópico seguinte no Guia-do programador Microsoft .NET Framework:
Assinatura de uma assemblagem com um nome seguro
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Para obter mais informações sobre este processo, consulte o tópico seguinte no Guia-do programador .NET Framework:
Transacções automáticas e classes do .NET Framework
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

Criar o projecto

  1. Siga estes passos para criar um novo projecto de aplicação de consola no Visual Basic. NET:
    1. Inicie o Visual Studio NET..
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Na caixa de diálogo Novo projecto , clique em Projectos do Visual Basic em Project Types , clique em Consola de aplicação em modelos e, em seguida, clique em OK .
    4. No Solution Explorer, mude o ficheiro Module1.vb DistributedTransaction.vb.
  2. Elimine todo o código do ficheiro DistributedTransaction.vb.
  3. No menu projecto , clique em Add Reference e, em seguida, adicione as seguintes referências:
    • System.EnterpriseServices
    • System.Data.dll

  4. Adicione o seguinte código ao ficheiro 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. No menu ficheiro , clique em Guardar tudo .
  6. Clique em Iniciar , aponte para programas , aponte para Microsoft Visual Studio. NET , aponte para Ferramentas do Visual Studio .NET e, em seguida, clique em Visual Studio .NET Command Prompt .
  7. Abra a pasta que contém o projecto e, em seguida, execute o seguinte comando para assinar a assemblagem com um nome seguro:
    sn -k DistributedTransaction.snk
  8. Crie a aplicação.
  9. Crie a seguinte tabela no primeiro servidor de 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. Execute a aplicação. Repare que receberá a seguinte mensagem de erro (que é o comportamento previsto):
    Transacção foi terminado: Erro devolvido: nome do objecto inválido 'NonExistentTable'.
  11. Abrir o SQL Server Query Analyzer, adicione o seguinte código e, em seguida, prima F5 para executar a consulta:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    Note que a consulta não devolve quaisquer linhas porque a transacção foi abortada.
  12. Localize o seguinte código no projecto do Visual Basic:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    e substitua a instrução SQL de uma consulta válida que não faz com que a interrupção da transacção. Por exemplo:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Prima F5 para compilar e executar a aplicação novamente.
  14. Execute novamente o comando do passo 11 no analisador de consultas. Repare que a consulta devolve uma linha porque a transacção não conseguiu concluir com êxito.
notas :
  • Neste exemplo não efectua o processamento de erros.
  • SQL Server e o coordenador de transacções distribuídas da Microsoft (MS DTC) terá de executar em todos os clientes e servidores.

Referências

Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
312902COMO: Criar um componente do serviço .NET no Visual Basic .NET

Propriedades

Artigo: 316627 - Última revisão: 24 de fevereiro de 2014 - Revisão: 2.1
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 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