Como usar transações COM + em um componente do Visual Basic .NET

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

Neste artigo

Sumário

Este artigo passo a passo mostra como usar COM + (Component Services) transações em uma classe Visual Basic. NET. Um conjunto de operações de banco de dados será considerado como uma unidade. As operações em todas bem-sucedida ou, se uma operação falhar, a transação inteira 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:
  • Microsoft Windows 2000 Server executando o SP-1
  • Serviços de informações da Internet (IIS) versão 4.0 ou posterior
  • Microsoft Internet Explorer versão 5.0, 5.5 ou 6.0
Conhecimento prévio necessário:
  • Conhecimento de conceitos transacionais e processamento
  • Familiaridade com + (Component Services)

Serviços transacionais COM +

O namespace System.EnterpriseServices dentro da Microsoft .NET Framework from VPE fornece a funcionalidade para implementar o processamento de transações. Para obter acesso para COM + serviços transacionais, crie uma classe seguindo estas etapas:
  1. Abra o Visual Studio .NET.
  2. Crie um novo projeto de biblioteca de classe chamado prjEnterprise em Visual Basic.NET. Visual Basic .NET cria uma classe pública é denominada Class1.
  3. Adicione uma referência para o projeto para a biblioteca de System.EnterpriseServices. Na janela Solution Explorer, clique com o botão direito na pasta de referências e, em seguida, selecione Add Reference no menu de atalho. Na guia .NET , role até você localizar System.EnterpriseServices . Clique duas vezes em System.EnterpriseServices , verifique se System.EnterpriseServices aparece na janela componentes selecionados e, em seguida, clique em OK .
  4. Use a declaração Imports para o espaço para nome System.EntpriseServices e namespace System.Data.SqlClient , para que você não precise qualificar totalmente quaisquer referências para esses namespaces posteriormente no seu código. Essas instruções devem aparecer antes para todas as outras instruções no arquivo de classe:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Para usar os serviços COM + transacional, sua classe, chamada clsES, deve herdar funcionalidade a partir ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. Um atributo Transaction é usado para especificar o nível de suporte transacional para a classe:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Crie um método dentro clsES chamado 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. Os 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:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. 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 esse banco de dados:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Defina um bloco Try para capturar qualquer processamento do banco de dados que pode ocorrer. Esses erros devem ser detectados para poder anular a transação. O bloco Try incluirá duas operações de banco de dados, cada um deles atualizar um campo diferente de um registro da tabela Produtos especificado.
    		Try
  10. Execute a primeira atualização para a tabela Produtos. Atualize o campo UnitsonOrder com o valor da onOrder para produto com identificação, como especificado nos dois primeiros parâmetros de entrada. Um SQLcommand é usado para executar essa atualização SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. Execute outra atualização para a tabela Produtos. Atualize o campo UnitsinStock com o valor da inStock para produto com identificação, como especificado nos parâmetros de entrada de terceiro e quarto. Um SQLCommand é usado para executar essa atualização SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. 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, duas atualizações--se nenhum erro foi gerado:
          ContextUtil.SetComplete()
  13. A conexão ao banco de dados Northwind é fechada:
          Conn.Close()
  14. Quaisquer erros que ocorrem ao executar os comandos SQL devem ser detectados para que a transação inteira pode ser anulada:
    	   Catch e As Exception
  15. 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
    		End Try
  16. Para este componente funcionar corretamente, o componente deve ter um nome forte. Siga estas etapas para gerar um nome de alta segurança e para assinar o assembly com nome forte:

    1. Para abrir um prompt de comando Visual Studio. NET, clique em Iniciar , clique em programas , clique em Microsoft Visual Studio .NET e em seguida, clique em Visual Studio .NET ferramentas .
    2. No prompt de comando, digite sn.exe -k snEnterprise.snk para dar seu assembly um nome de alta segurança.

      Para obter mais informações sobre assinatura de assemblies com nomes fortes, consulte a documentação do .NET Framework SDK.
    3. Copie snEnterprise.snk para a pasta de projeto.
    4. No AssemblyInfo.vb, adicionar a linha de código a seguir antes ou depois outras instruções de atributo de assembly:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Salve e criar seu projeto.

Listagem de código completo

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

Verificar se ele funciona

Para testar esse código, crie um aplicativo de console usa 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, com a transação que está sendo ignorada.
  1. Adicione um novo aplicativo console chamado testES à sua solução, para que a solução contém o projeto testES e projeto prjEnterprise. Para adicionar o novo projeto, clique em novo no menu arquivo e, em seguida, selecione Project .
  2. Uma caixa de diálogo New Project aparece. Selecione a pasta Visual Basic no projeto painel Types e, em seguida, selecione Aplicativo de console dos modelos. Na caixa nome no painel modelos, digite testES , que é o nome do projeto. Verifique se a opção no botão Add to Solution , que aparece na parte inferior da caixa de diálogo, é selecionado. Clique em OK para adicionar este projeto à solução.
  3. Em ordem para testES testar clsES, você deve adicionar uma referência. Na janela soluções, clique com botão direito na pasta de referências do que está em testES o projeto, que você acabou de adicionar. Selecione Add Reference . Uma caixa de diálogo Add Reference é exibida.
  4. Selecione a guia projetos e em seguida, clique duas vezes em prjEnterprise . Uma referência deve aparecer em Componentes selecionados , que está na parte inferior da caixa de diálogo. Clique em OK para adicionar essa referência para este projeto.
  5. Clique com o botão direito do mouse o aplicativo de console, testES e selecione Set as Startup Project .
  6. No menu Debug , selecione Windows . No submenu, selecione imediata . Isso garante que a janela Verificação imediata ficará visível.
  7. Copie o seguinte código de teste no módulo Módulo1, substituindo as instruções Sub Main e End Sub. O módulo deve aparecer da seguinte maneira:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. Pressione F5 para executar o código de teste.
  9. No código da etapa 7, a primeira chamada para dbAccess terá êxito. Um produto 1 e 2 um 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, a janela Verificação imediata deve exibir a mensagem "TRANSACTION uma - êxito".

    A segunda chamada para dbAccess falha. Portanto, nem uma das instruções de atualização dentro dbAccess para os produtos da tabela é remetida 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 dentro de definição da tabela Produtos, inStock não pode ter números negativos.

    Conseqüentemente, esta chamada para dbAccess falha, resultando em falha do transação inteira. A Tabela Produtos permanece como estava antes da chamada para dbAccess. A instrução Catch trata notificação de falha a transação de dbAccess, resultando na mensagem "Falha de TRANSACTION" sendo exibido na janela Verificação imediata.
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; produto 2, o instock campo é 888. Conseqüentemente, a segunda chamada para dbAccess, o que causaria valores diferentes para esses campos, falhou.

Solução de problemas

  • Certifique-se que qualquer projeto que usa serviços COM+ tenha um nome forte.
  • Qualquer classe que usa serviços COM + deve herdar da componente de serviço, que é encontrado 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 obtém 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 você construir aplicativos distribuídos
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Componentes atendidos
http://msdn.microsoft.com/en-us/library/aa289839.aspx

Propriedades

ID do artigo: 315707 - Última revisão: terça-feira, 8 de novembro de 2005 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbhowtomaster KB315707 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: 315707

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