COMO: Efectuar uma transacção distribuída com um fornecedor de .NET utilizando 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 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
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Para obter uma Microsoft Visual C# .NET versão deste artigo, consulte 316247.

Este artigo faz referência à seguintes espaços de nomes 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 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.

back to the top

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

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: Para obter mais informações sobre este processo, consulte o tópico seguinte no Guia-do programador .NET Framework: back to the top

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

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 316627 - Última Revisão: 02/24/2014 06:10:43 - 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