COMO: Executar uma transação distribuída com um provedor do .NET usando ServicedComponent no Visual translation from VPE for Csharp .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 316247 - Exibir os produtos aos quais esse artigo se aplica.
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, Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 ou Microsoft 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 .
  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/en-us/library/xc31ft41.aspx
Para obter mais informações sobre esse processo, consulte o seguinte tópico na guia do desenvolvedor do Microsoft .NET Framework:
Transações automáticas e classes do .NET Framework
http://msdn.microsoft.com/en-us/library/ms123400.aspx

Criar o projeto

  1. Siga estas etapas para criar um novo projeto Console Application no Visual translation from VPE for Csharp. 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 translation from VPE for Csharp em Project Types , clique em Aplicativo de console em modelos e, em seguida, clique em OK .
    4. No Solution Explorer, renomeie o arquivo Class1.cs como DistributedTransaction.cs.
  2. Exclua todo o código do arquivo DistributedTransaction.cs.
  3. No menu Project , clique em Add Reference e adicione as seguintes referências:
    • System.EnterpriseServices
    • System.Data.dll

  4. No arquivo AssemblyInfo.cs, comentar as linhas de código a seguir:
    [assembly: AssemblyKeyFile("")]
    [assembly: AssemblyKeyName("")]
    					
  5. Adicione o código a seguir ao arquivo DistributedTransaction.cs:
    using System;
    using System.Data.SqlClient;
    using System.EnterpriseServices;
    using System.Runtime.CompilerServices;
    using System.Reflection;
    
    [assembly: ApplicationName("DistributedTransaction")]
    [assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")]
    
    
    namespace DistributedTransaction
    {
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       class Class1
       {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          [STAThread]
          static void Main(string[] args)
          {
             try
             {
                DistributedTran myDistributedTran = new DistributedTran();
                myDistributedTran.TestDistributedTransaction();
             }
             catch (System.Data.SqlClient.SqlException e)
             {
                System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message);
             }         
          }
       }
       /// <summary>
       /// Summary description for TestApp.
       /// </summary>
       [Transaction(TransactionOption.Required)]
       public class DistributedTran: ServicedComponent 
       {
          public DistributedTran()
          {
          }
          [AutoComplete]
          public string TestDistributedTransaction()
          {
             // The following Insert statement goes to the first server.
             // This Insert statement does not produce any errors. 
             String insertCmdSql = "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.
             String exceptionCausingCmdSQL = "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.
             SqlConnection SqlConn1 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
             SqlConnection SqlConn2 = new SqlConnection("Server=Server_Name;uid=User_Id;database=DatabaseName;pwd=Password");
    
             try
             {
                SqlCommand insertCmd = new SqlCommand(insertCmdSql,SqlConn1);
                SqlCommand exceptionCausingCmd = new SqlCommand(exceptionCausingCmdSQL,SqlConn2);
       
                // This command runs 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();
                int cmdResult = exceptionCausingCmd.ExecuteNonQuery();
                
                SqlConn1.Close();
                SqlConn2.Close();
    
                Console.WriteLine("Hello");
                
             }
             catch (System.Data.SqlClient.SqlException ex)
             {
                // 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")
                   SqlConn1.Close();
    
                if (SqlConn2.State.ToString() == "Open")
                   SqlConn2.Close();
             }
    
             return "Success";
           
          }
    
       }
    }
    					
  6. No menu arquivo , clique em Salvar tudo .
  7. 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 .
  8. 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
  9. Crie seu aplicativo.
  10. 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 
    					
  11. 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'.
  12. 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.
  13. Localize o código a seguir no seu projeto Visual translation from VPE for Csharp:
    String exceptionCausingCmdSQL = "Delete from NonExistentTable";
    						
    e substituir a instrução SQL com uma consulta válida que não cause anular a transação. Por exemplo:
    String exceptionCausingCmdSQL = "Select @@Identity from customers";
    					
  14. Pressione F5 para compilar e executar o aplicativo novamente.
  15. Execute novamente o comando da etapa 12 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:
306296COMO: Criar um componente de serviço .NET que usa transações no Visual translation from VPE for Csharp .NET

Propriedades

ID do artigo: 316247 - Última revisão: quinta-feira, 4 de setembro de 2003 - Revisão: 3.3
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Enterprise Services (included with the .NET Framework) 1.0
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
Palavras-chave: 
kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316247 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: 316247

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