Entrar

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

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.

316627
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 316247.

Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.Data.SqlClient
  • System.EnterpriseServices
  • System.Runtime.CompilerServices
  • System.Reflection

NESTA TAREFA

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.

back to the top

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
back to the top

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: Para obter mais informações sobre esse processo, consulte o tópico a seguir no guia do desenvolvedor do .NET Framework: back to the top

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 SystemImports System.Data.SqlClientImports System.EnterpriseServicesImports System.Runtime.CompilerServicesImports 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 ClassEnd 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]GOCREATE 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.
back to the top
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
back to the top

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316627 - Última Revisão: 02/24/2014 12:55:15 - Revisão: 2.1

  • 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
  • kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtpt
Comentários