COMO: Executar uma transação distribuída com um provedor do .NET usando ServicedComponent no Visual Basic .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 316627 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo passo a passo demonstra como executar uma transação distribuída usando um provedor do .NET com a classe ServicedComponent . Embora este artigo Use o provedor do SqlClient .NET em um servidor Microsoft SQL Server, você também pode usar o provedor gerenciado ODBC ou OLE DB .NET.

Requisitos

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

Visão geral

Instâncias de uma classe .NET Framework podem participar de uma transação automática se preparar a classe para fazer isso. Cada recurso que acessa uma instância de classe ou um objeto inscreve na transação. Por exemplo, se um objeto usa o ADO.NET para postar dinheiro em uma conta em um banco de dados, o Gerenciador de recursos para o banco de dados determina se o objeto é executado em uma transação. Se o objeto deve executar em uma transação, o Gerenciador de recursos inscreve automaticamente o banco de dados da transação.

Use o seguinte processo para preparar uma classe para participar de uma transação automática:
  1. Aplica classe TransactionAttribute a sua classe para especificar o tipo de transação automática que solicita o componente.

    O tipo de transação deve ser um membro da enumeração TransactionOption . Por exemplo:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. Derivar a classe de classe ServicedComponent . ServicedComponent é a classe base de todas as classes que usam serviços COM +.
  3. Assinar o assembly com um nome forte para garantir que o assembly contém um par de chaves exclusivo.
  4. Registre o assembly que contém sua classe com o catálogo COM +.

    Observação : se o cliente que chama uma instância da classe é gerenciado pelo common language runtime, o registro é realizado para você. Essa etapa é necessária somente se um chamador não gerenciado cria e chama as instâncias da sua classe. Use a ferramenta de instalação de serviços do .NET (RegSvcs.exe) para registrar manualmente o assembly.
Para obter mais informações sobre como assinar um assembly com um nome forte, consulte o tópico a seguir no guia do desenvolvedor do Microsoft .NET Framework:
Assinar um assembly com um nome forte
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Para obter mais informações sobre esse processo, consulte o tópico a seguir no guia do desenvolvedor do .NET Framework:
Transaçõ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 projeto

  1. Siga estas etapas para criar um novo projeto Console Application no Visual Basic. NET:
    1. Inicie o Visual Studio NET..
    2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
    3. Na caixa de diálogo New Project , clique em Projetos do Visual Basic em Project Types , clique em Aplicativo de console em modelos e, em seguida, clique em OK .
    4. No Solution Explorer, renomeie o arquivo Module1.vb como DistributedTransaction.vb.
  2. Exclua todo o código do arquivo DistributedTransaction.vb.
  3. No menu Project , clique em Add Reference e adicione as seguintes referências:
    • System.EnterpriseServices
    • System.Data.dll

  4. Adicione o código a seguir ao arquivo 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 arquivo , clique em Salvar tudo .
  6. Clique em Iniciar , aponte para programas , aponte para Microsoft Visual Studio. NET , aponte para Visual Studio .NET Tools e, em seguida, clique em Visual Studio .NET Command Prompt .
  7. Abra a pasta que contém o projeto e, em seguida, execute o seguinte comando para assinar o assembly com um nome forte:
    DistributedTransaction.snk sn -k
  8. Crie seu aplicativo.
  9. Crie a seguinte tabela no primeiro servidor 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 o aplicativo. Observe que você recebe a seguinte mensagem de erro (que é o comportamento esperado):
    Transação anulado: Erro retornado: nome do objeto inválido 'NonExistentTable'.
  11. Abra o SQL Server Query Analyzer, adicionar o código a seguir e, em seguida, pressione F5 para executar a consulta:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    Observe que a consulta não retorna quaisquer linhas porque a transação foi anulada.
  12. Localize o código a seguir no seu projeto Visual Basic:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    e substituir a instrução SQL com uma consulta válida que não cause anular a transação. Por exemplo:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Pressione F5 para compilar e executar o aplicativo novamente.
  14. Execute novamente o comando da etapa 11 no Query Analyzer. Observe que a consulta retorna uma linha, porque a transação não pôde concluir com êxito.
Observações :
  • Este exemplo não executa o tratamento de erros.
  • SQL Server e Microsoft Distributed Transaction Coordinator (MS DTC) devem estar em execução em todos os clientes e servidores.

Referências

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

Propriedades

ID do artigo: 316627 - Última revisão: segunda-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316627

Submeter comentários

 

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