Como usar transações COM + em um componente translation from VPE for Csharp Visual

Traduções deste artigo Traduções deste artigo
ID do artigo: 816141 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo passo a passo descreve como usar COM + (Component Services) transações em uma classe translation from VPE for Csharp Visual. Um conjunto de operações de banco de dados é considerado uma unidade. Ou todas as operações bem-sucedida ou, se uma operação falhar, toda a transação falhará. No último caso, quaisquer operações de banco de dados que foram tentadas serão lançadas para o banco de dados subjacente.

Requisitos

Os seguintes itens descrevem recomendado de hardware, software, infra-estrutura de rede, habilidades e conhecimento e service packs que você deve ter:
  • Microsoft Windows 2000 Server SP1
  • Serviços de informações da Internet (IIS) versão 4.0 ou posterior
  • Versões do Microsoft Internet Explorer 5.0, 5.5 ou 6.0
Este artigo pressupõe que você esteja familiarizado com o seguinte:
  • Conceitos transacionais e processamento
  • COM + (Component Services)

Serviços de transações COM +

Você pode implementar transação processamento com o namespace System.EnterpriseServices no Microsoft .NET Framework. Para acesso COM + serviços transacionais, crie uma classe. Para fazer isso, execute as seguintes etapas:
  1. Inicie o Visual Studio .NET ou Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. Clique em projetos do Visual translation from VPE for Csharp em Tipos de projeto e, em seguida, clique em Class Library em modelos . Nomeie o projeto prjEnterprise .

    Observação No Visual Studio 2005, clique em translation from VPE for Csharp Visual em Tipos de projeto e, em seguida, clique em Class Library em modelos . Nomeie o projeto prjEnterprise .
  4. Por padrão, Class1 é criado.
  5. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .
  6. A caixa de diálogo Add Reference é exibida. Em Nome do componente na guia .NET , clique duas vezes em System.EnterpriseServices .
  7. Verifique se System.EnterpriseServices aparece em Componentes selecionados . Clique em OK .
  8. Adicione o seguinte código antes de para todas as outras instruções no arquivo Class1.cs:
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Adicione uma nova classe é denominada clsES para o arquivo Class1.cs.
  10. Para usar os serviços COM + transacional, sua classe ( clsES ) deve herdar funcionalidade de ServicedComponent da seguinte maneira:
    public class clsES : ServicedComponent
  11. Um atributo Transaction é usado para especificar o nível de suporte transacional para a classe da seguinte maneira:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Criar um método na classe clsES e denomine dbAccess que recebe quatro parâmetros de entrada inteiro. Os primeiros dois parâmetros fornecem uma identificação do produto e as unidades em ordem para que o produto. Segundo dois parâmetros fornecem uma identificação do produto e as unidades em estoque para o produto. Esse método realiza um conjunto de operações de banco de dados em relação a estas identificações de produto especificado que precisam ser tratados como uma transação:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. No método dbAccess , criar um objeto de conexão SQL para a Northwind banco de dados e abra a conexão. Operações de banco de dados ocorrem usando o seguinte banco de dados:

    Observação Lembre-se de alterar os seguinte parâmetros de seqüência de caracteres de conexão para refletir os valores corretos para seu servidor SQL.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Defina um bloco try para capturar todas as exceções que podem ocorrer durante o processamento de banco de dados. Você deve capturar essas exceções para anular a transação. O bloco try inclui duas operações de banco de dados. Cada operação atualiza um campo diferente do especificado produtos tabela registro.
     try { 
    
  15. Execute a primeira atualização para a tabela Produtos. Atualize o campo UnitsonOrder com o valor onOrder do produto com identificação, como especificado nos dois primeiros parâmetros de entrada. Use o seguinte comando SQL para executar esta atualização SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Execute outra atualização para a tabela Produtos. Atualizar o campo UnitsinStock com o inStock valor para o produto com identificação, como especificado nos parâmetros de entrada de terceiro e quarto. Use o seguinte comando SQL para executar esta atualização SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. Como essas atualizações são parte de uma transação COM +, eles são confirmados como uma unidade. O método setComplete da classe contextUtil do namespace System.EnterpriseServices é usado para confirmar a transação (nesse caso as duas atualizações) se nenhum erro foi gerado:
    ContextUtil.SetComplete();
  18. A conexão ao banco de dados Northwind é fechada:
    Conn.Close();
    }
  19. Você deve capturar quaisquer exceções que ocorrem ao executar os comandos SQL para que você pode anular a transação inteira:
    catch(Exception e){ 
  20. O método setAbort da classe contextUtil do namespace System.EnterpriseServices é usado para anular a transação inteira. Se a primeira atualização for bem-sucedida e a segunda actualização falha, nenhuma atualização é lançada a tabela Produtos. A detectada exceção é lançada para o chamador, indicando que a transação falhou:
    ContextUtil.SetAbort();
    				throw e;
    }
  21. Para este componente funcionar corretamente, o componente deve ter um nome forte. Gerar um nome de alta segurança e, em seguida, assinar o assembly com nome forte. Para fazer isso, execute as seguintes etapas:
    1. No prompt de comando Visual Studio. NET, digite sn.exe -k snEnterprise.snk para criar um arquivo de chave. Para obter mais informações sobre assinatura de assemblies com nomes fortes, consulte a documentação do .NET Framework SDK.
    2. Copie snEnterprise.snk para a pasta de projeto.
    3. Em AssemblyInfo.vc, adicionar a linha de código a seguir antes ou depois outras instruções de atributo de assembly:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Salve e, em seguida, criar seu projeto.

Concluir a listagem de código

Observação Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
	{
		public SqlConnection Conn;

		public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
				Conn.Open();
				
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
				sqlCommand.ExecuteNonQuery();
				
				sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
				sqlCommand.ExecuteNonQuery();

				ContextUtil.SetComplete();
				Conn.Close();
			}
			catch(Exception e)
			{
				ContextUtil.SetAbort();
			
				throw e;
			}
			finally
			{

			}
		}
	}	
}

Verificar se ele funciona

Para testar esse código, crie um aplicativo de console que usa o projeto clsES. Em um caso, uma transação tiver êxito e onorder e instock campos para o produto especificado são atualizados. No segundo caso, a atualização para o campo onOrder para um produto especificado tiver êxito, mas a atualização para o inStock campo para um produto falha porque o número de produto especificado não existe na tabela Produtos. Isso resulta em uma falha de transação e a transação é ignorada.
  1. No Visual Studio .NET ou Visual Studio 2005, aponte para novo no menu arquivo e, em seguida, clique em Project .
  2. Clique em projetos do Visual translation from VPE for Csharp em Tipos de projeto e, em seguida, clique em Aplicativo de console em modelos .

    Observação No Visual Studio 2005, clique em translation from VPE for Csharp Visual em Tipos de projeto e, em seguida, clique em Aplicativo de console em modelos .
  3. Na caixa de texto nome , digite testES . Certifique-se que a opção Add to Solution é selecionada.
  4. Clique em OK para adicionar este projeto à solução.
  5. Para testES testar clsES , você deve adicionar uma referência. No Solution Explorer, clique com o botão direito do mouse referências em testES (que você acabou de adicionar) e, em seguida, clique em Add Reference .
  6. A caixa de diálogo Add Reference é exibida. Na guia projetos , clique duas vezes em prjEnterprise .
  7. Uma referência é exibida em selecionado componentes . Clique em OK para adicionar essa referência para o projeto.
  8. Adicione uma referência para o projeto para a biblioteca de System.EnterpriseServices. No Solution Explorer, clique com o botão direito do mouse em References e, em seguida, clique em Add Reference .
  9. A caixa de diálogo Add Reference é exibida. Em Nome do componente na guia .NET , clique duas vezes em System.EnterpriseServices .
  10. Verifique se System.EnterpriseServices aparece em Componentes selecionados . Clique em OK .
  11. Clique com o botão direito do mouse o aplicativo de console ( testES ) e em seguida, clique em Definir como projeto de inicialização
  12. Cole o seguinte código fonte na função principal da classe Class1 :
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    
    				try 
    				{
    					myTest.dbAccess(1, 777, 2, 888);
    					Console.WriteLine("TRANSACTION ONE -- SUCCESS");
    
    					myTest.dbAccess(1, 5, 2, -20);
    					Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    				}
    				catch (Exception e)
    				{
    					Console.WriteLine("TRANSACTION FAILURE");
    				}
  13. Pressione F5 para executar o código de teste.

    No código da etapa 7, a primeira chamada para dbAccess terá êxito. Produto 1 e 2 do produto são na tabela Produtos. O campo onOrder para produto 1 é atualizado para 777 e o inStock campo para o produto 2 é atualizado para 888. Porque esta transação bem-sucedida, receber a seguinte mensagem na janela de saída
    ÊXITO DE UM - TRANSAÇÃO


    A segunda chamada para dbAccess falha. Portanto, nenhuma instrução de atualização em dbAccess à tabela Produtos é lançada para o banco de dados. Embora produto 1 pode ter seu campo onOrder atualizado para 5 , produto 2 não pode ter seu inStock campo definido para -20 . Devido a uma restrição que é definida na definição da tabela Produtos, inStock não é permitido com números negativos.

    Portanto, esta chamada para dbAccess falha, e toda a transação falha. A tabela Produtos permanece como estava antes da chamada para dbAccess . Notificação de falha na transação de dbAccess lida com a instrução catch e exibida a seguinte mensagem de erro na janela de saída:
    FALHA DE TRANSAÇÃO
  14. Examine o conteúdo da tabela Produtos Northwind usando o SQL Server Enterprise Manager. Quando você exibir produto 1, o campo onOrder é igual a 777. Quando você exibir produto 2, o instock campo é 888. Portanto, a segunda chamada para dbAccess (o que causaria valores diferentes para esses campos) falhará.

Solucionar problemas

  • Certifique-se que qualquer projeto que usa serviços COM+ tenha um nome forte.
  • Qualquer classe que usa serviços COM + deve herdar a partir o componente de serviço. O componente de serviço está localizado no namespace System.EnterpriseServices .
  • Durante a depuração, uma transação pode ser tempo limite antes de ser confirmada ou anulada. Para evitar um tempo limite, use uma propriedade de tempo limite no atributo de transação. No exemplo a seguir, o método associado tem 1.200 segundos para concluir qualquer transação antes de ele expira:
    [Transaction(TransactionOption.Required,timeout=1200)]

Referências

Para obter informações adicionais, visite os seguintes Microsoft Developer Network (MSDN) na Web:
COM + Integration: Como .NET Enterprise Services podem ajudar a você criar aplicativos distribuídos
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Componentes atendidos
http://msdn2.microsoft.com/en-us/library/Aa289839(VS.71).aspx

Propriedades

ID do artigo: 816141 - Última revisão: quinta-feira, 22 de novembro de 2007 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 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: 816141

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