Você está offline; aguardando reconexão

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

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
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 315707.

NESTA TAREFA

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.

back to the top

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

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

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			{			}		}	}	}

back to the top

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

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

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 816141 - Última Revisão: 11/22/2007 08:17:35 - Revisão: 4.3

Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition

  • kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 KbMtpt
Comentários