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

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

NESTA TAREFA

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.

back to the top

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

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

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

back to the top

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

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