Como utilizar transacções COM + de um componente do Visual C#

Traduções de Artigos Traduções de Artigos
Artigo: 816141 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo passo a passo descreve como utilizar o COM + (Serviços de componentes) transacções de uma classe do Visual C#. Um conjunto de operações de base de dados é considerado como uma unidade. Como todas as operações tiveram êxito ou, se uma operação falhar, a transacção inteira falha. Neste último caso, quaisquer operações de base de dados que foram tentadas não são registadas na base de dados subjacente.

Requisitos

Os seguintes itens descrevem o hardware recomendado, software, infra-estrutura de rede, competências e conhecimentos e service packs que tem de ter:
  • Microsoft Windows 2000 Server SP1
  • Microsoft Internet Information Services (IIS) versão 4.0 ou posterior
  • Microsoft Internet Explorer versões 5.0, 5.5 ou 6.0
Este artigo pressupõe que está familiarizado com o seguinte:
  • Conceitos de transacções e processamento
  • COM + (Serviços de componentes)

Serviços de transacções COM +

Pode implementar transacções processar com o espaço de nomes System.EnterpriseServices no Microsoft .NET Framework. Para acesso COM + Serviços transaccionais, crie uma classe. Para o fazer, siga estes passos:
  1. Inicie o Visual Studio .NET ou Visual Studio 2005.
  2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
  3. Clique em Visual C# Projects em Project Types e, em seguida, clique em Biblioteca de classes em modelos . Nome do projecto prjEnterprise .

    Nota No Visual Studio 2005, clique em Visual C# em Project Types e, em seguida, clique em Biblioteca de classes em modelos . Nome do projecto prjEnterprise .
  4. Por predefinição, é criado Aula1.
  5. No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em Add Reference .
  6. A caixa de diálogo Adicionar referência do é apresentada. Em Nome do componente no separador .NET , clique duas vezes System.EnterpriseServices .
  7. Certifique-se de que System.EnterpriseServices é apresentado em Componentes seleccionados . Clique em OK .
  8. Adicione o seguinte código antes de outras instruções no ficheiro Class1.cs:
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Adicionar uma classe nova com o nome clsES para o ficheiro Class1.cs.
  10. Para utilizar serviços de transaccional COM +, a classe ( clsES ) tem de herdar a funcionalidade de ServicedComponent da seguinte forma:
    public class clsES : ServicedComponent
  11. Um atributo de transacções é utilizado para especificar o nível de suporte transaccional para a classe da seguinte forma:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Criar um método na classe clsES e é o nome dbAccess que recebe quatro parâmetros de entrada número inteiro. Os primeiros dois parâmetros fornecem um ID do produto e as unidades na encomenda para esse produto. Os parâmetros de dois segundos fornecem um ID do produto e as unidades em stock para esse produto. Este método efectua um conjunto de operações de base de dados nestes IDs de produto especificado estão a ser tratada como uma transacção:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. Método dbAccess , criar um objecto de ligação SQL para a base da base de dados e abra a ligação. Operações de base de dados ocorrem utilizando a base de dados seguinte:

    Nota Não se esqueça de alterar os seguintes parâmetros de cadeia de ligação para reflectir os valores correctos para o servidor de SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Defina um bloco tente capturar quaisquer excepções que poderão ocorrer durante o processamento da base de dados. Tem a detectar estas excepções para abortar a transacção. O bloco tente inclui duas operações de base de dados. Cada operação actualiza um campo diferente de um registo de tabela de produtos especificados.
     try { 
    
  15. Execute a primeira actualização à tabela produtos. Actualizar o campo UnitsonOrder com o valor de onOrder para produtos com o ID, tal como especificado nos primeiros dois parâmetros de entrada. Utilize o seguinte comando SQL para executar esta actualização SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Efectue outra actualização à tabela produtos. Actualizar o campo Existências com o inStock valor para o produto com o ID, como especificado nos parâmetros de entrada de terceiro e quarto. Utilize o seguinte comando SQL para executar esta actualização SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. Uma vez que estas actualizações fazem parte de uma transacção COM +, são consolidadas como uma unidade. O método setComplete da classe contextUtil do espaço de nomes System.EnterpriseServices é utilizado para consolidar a transacção (neste caso as duas actualizações de) se erros não foram iniciados:
    ContextUtil.SetComplete();
  18. A ligação à base de dados Adamastor é fechada:
    Conn.Close();
    }
  19. Tem de detectar quaisquer excepções ocorrem ao executar os comandos SQL, de modo que pode cancelar a transacção inteira:
    catch(Exception e){ 
  20. O método setAbort da classe contextUtil do espaço de nomes System.EnterpriseServices é utilizado para abortar a transacção completa. Se a primeira actualização tiver êxito e a segunda actualização falha, é registada nenhum actualização à tabela de produtos. O caught excepção ao emissor, que indica que a transacção falhou:
    ContextUtil.SetAbort();
    				throw e;
    }
  21. Para este componente para funcionar correctamente, o componente tem de ter um nome seguro. Gerar um nome seguro e, em seguida, iniciar sessão a assemblagem com nome seguro. Para o fazer, siga estes passos:
    1. Na linha de comandos Visual Studio. NET, escreva sn.exe -k snEnterprise.snk para criar um ficheiro de chave. Para obter mais informações sobre assemblagens assinatura com nomes seguros, consulte a documentação do .NET Framework SDK.
    2. Copie snEnterprise.snk para a pasta de projecto.
    3. No AssemblyInfo.vc, adicione a seguinte linha de código antes ou depois de outras instruções de atributo de assemblagem:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Guarde e, em seguida, criar o projecto.

Concluir lista de código

Nota 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 funciona

Para testar este código, crie uma aplicação de consola que utiliza o projecto clsES. Num caso, uma transacção tiver êxito e onorder e instock campos para o produto especificado são actualizados. No segundo caso, tiver êxito a actualização para o campo onOrder para um produto especificado, mas a actualização para o inStock campo para um produto falha porque o número de produto especificada não existe na tabela produtos. Isto resulta numa falha de transacção e a transacção é ignorada.
  1. No Visual Studio .NET ou Visual Studio 2005, aponte para Novo no menu ficheiro e, em seguida, clique em projecto .
  2. Clique em Visual C# Projects em Project Types e, em seguida, clique em Aplicação de consola em modelos .

    Nota No Visual Studio 2005, clique em Visual C# em Project Types e, em seguida, clique em Aplicação de consola em modelos .
  3. Na caixa de texto nome , escreva testES . Certifique-se que a opção Adicionar solução está seleccionada.
  4. Clique em OK para adicionar este projecto para a solução.
  5. Para testES testar clsES , tem de adicionar uma referência. No Solution Explorer, clique com o botão direito do rato em referências em testES (que acabou de adicionar) e, em seguida, clique em Add Reference .
  6. A caixa de diálogo Adicionar referência do é apresentada. No separador projectos , faça duplo clique em prjEnterprise .
  7. Uma referência aparece em seleccionado componentes . Clique em OK para adicionar esta referência ao projecto.
  8. Adicione uma referência ao projecto para a biblioteca de System.EnterpriseServices. No Solution Explorer, clique com o botão direito do rato em References e, em seguida, clique em Add Reference .
  9. A caixa de diálogo Adicionar referência do é apresentada. Em Nome do componente no separador .NET , clique duas vezes System.EnterpriseServices .
  10. Certifique-se de que System.EnterpriseServices é apresentado em Componentes seleccionados . Clique em OK .
  11. Clique com o botão direito a aplicação de consola ( testES ) e, em seguida, clique em estabelecer como projecto de arranque
  12. Cole o seguinte código origem na função principal da classe Aula1 :
    	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. Prima F5 para executar o código de teste.

    No código no passo 7, a primeira chamada para dbAccess terá êxito. Produto 1 e 2 do produto são na tabela produtos. O campo onOrder para o produto 1 é actualizado para 777 e o inStock campo para o produto 2 é actualizado para 888. Uma vez que esta transacção foi bem sucedida, receberá a seguinte mensagem na janela de resultados
    ÊXITO DE UM - TRANSACÇÃO


    A segunda chamada dbAccess falha. Deste modo, nenhuma instrução de actualização dbAccess à tabela produtos é registada na base de dados. Apesar de produto 1 pode ter o respectivo campo onOrder actualizado para 5 , produto 2 não pode ter o inStock campo definido para -20 . Devido a uma restrição definido na definição da tabela Produto, inStock não é permitido para que os números negativos.

    Por conseguinte, esta chamada para dbAccess falha e a transacção inteira falha. A tabela Produtos permanece tal como estava antes da chamada para dbAccess . A instrução ' catch processa a notificação de falha de transacção de dbAccess e receberá a seguinte mensagem de erro na janela de resultados:
    FALHA DE TRANSACÇÃO
  14. Examine o conteúdo da tabela produtos de base de dados Adamastor utilizando o SQL Server Enterprise Manager. Quando visualiza o produto 1, o campo onOrder é igual a 777. Quando visualiza o produto 2, o instock campo é 888. Por conseguinte, a segunda chamada dbAccess (o que resultaria em valores diferentes para estes campos) falha.

Resolução de problemas

  • Certifique-se que qualquer projecto que utiliza serviços COM + tem um nome seguro.
  • Qualquer classe que utiliza serviços COM + tem Herdar do componente de serviço. O componente serviço está localizado no espaço de nomes de System.EnterpriseServices .
  • Durante a depuração, uma transacção pode limite de tempo antes de serem consolidada ou abortada. Para evitar um tempo limite, utilize uma propriedade de tempo de espera no atributo transacção. No exemplo seguinte, o método associado tem 1.200 segundos para concluir quaisquer transacções antes de o tempo limite:
    [Transaction(TransactionOption.Required,timeout=1200)]

Referências

Para obter informações adicionais, visite os seguintes Web sites da Microsoft Developer Network (MSDN):
Integração COM +: Como .NET Enterprise Services podem ajudar é criar aplicações distribuídas
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Componentes do serviço
http://msdn2.microsoft.com/en-us/library/Aa289839(VS.71).aspx

Propriedades

Artigo: 816141 - Última revisão: 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 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: 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