Como utilizar o COM + transacções num componente do Visual Basic .NET

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

Nesta página

Sumário

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

Serviços de transacções COM +

O espaço de nomes System.EnterpriseServices no Microsoft .NET framework fornece a funcionalidade para implementar o processamento de transacções. Para aceder a + serviços transaccionais, criar uma classe seguindo estes passos:
  1. Abra o Visual Studio. NET.
  2. Crie um novo projecto de biblioteca classe denominado prjEnterprise no Visual Basic. NET. Visual Basic .NET cria uma classe pública denominada Aula1.
  3. Adicione uma referência ao projecto para a biblioteca de System.EnterpriseServices. Na janela Solution Explorer, clique com o botão direito do rato na pasta de referências e, em seguida, seleccione Adicionar referência no menu de atalho. No separador .NET , desloque-se até localizar System.EnterpriseServices . Faça duplo clique em System.EnterpriseServices , certifique-se que System.EnterpriseServices aparece na janela componentes seleccionados e, em seguida, clique em OK .
  4. Utilize a instrução de importações para o espaço de nomes System.EntpriseServices e espaço de nomes System.data.SqlClient , para que não terá que qualificar totalmente quaisquer referências a estes espaços de nomes mais tarde no código. Estas instruções têm de aparecer antes para outras instruções no ficheiro de classe:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Para utilizar serviços de transaccional COM +, a classe, nome clsES, tem de herdar a funcionalidade de ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. Um atributo de transacções é utilizado para especificar o nível de suporte transaccional para a classe:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Crie um método num clsES chamado dbAccess que recebe quatro parâmetros de entrada 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:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. 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 efectuada utilizando esta base de dados:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Defina um bloco try para capturar qualquer processamento de base de dados que possa ocorrer. Estes erros tem de ser detectados para conseguir abortar a transacção. O bloco try incluirá duas operações de base de dados, cada um deles actualizar um campo diferente num registo de tabela de produtos especificado.
    		Try
  10. Execute a primeira actualização à tabela produtos. Actualizar o campo UnitsonOrder com o valor de onOrder produto com o ID, tal como especificado nos primeiros dois parâmetros de entrada. Um SQLcommand é utilizado para executar esta actualizaçã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. Efectue outra actualização à tabela produtos. Actualizar o campo Existências com o valor de inStock para produto com o ID, como especificado nos parâmetros de entrada de terceiro e quarto. Um SQLCommand é utilizado para executar esta actualização SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. 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--se erros não foram iniciados:
          ContextUtil.SetComplete()
  13. A ligação à base de dados Adamastor é fechada:
          Conn.Close()
  14. Quaisquer erros que ocorram ao executar os comandos SQL tem de ser detectados, para que toda a transacção pode ser anulada:
    	   Catch e As Exception
  15. O método setAbort da classe contextUtil do espaço de nomes System.EnterpriseServices é utilizado para abortar a transação inteira. 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
    		End Try
  16. Para este componente funcionar correctamente, o componente tem de ter um nome seguro. Siga estes passos para gerar um nome seguro e para assinar a assemblagem com nome seguro:

    1. Para abrir uma linha de comandos Visual Studio. NET, clique em Iniciar , clique em programas , clique em Microsoft Visual Studio .NET e, em seguida, clique em Ferramentas do Visual Studio .NET .
    2. Na linha de comandos, escreva sn.exe -k snEnterprise.snk para dar a assemblagem um nome seguro.

      Para obter mais informações sobre assemblagens assinatura com nomes seguros, consulte a documentação do .NET Framework SDK.
    3. Copie snEnterprise.snk para a pasta de projecto.
    4. No AssemblyInfo.vb, adicione a seguinte linha de código antes ou depois de outras instruções de atributo de assemblagem:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Guardar e criar o projecto.

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 funciona

Para testar este código, crie uma aplicação de consola que utiliza 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, com a transacção a ser ignorada.
  1. Adicione uma nova aplicação de consola testES à sua solução, o nome para que a solução contém o projecto testES e o projecto prjEnterprise. Para adicionar o novo projecto, clique em Novo no menu ficheiro e, em seguida, seleccione o projecto .
  2. É apresentada a uma caixa de diálogo Novo projecto . Seleccione a pasta do Visual Basic no Project tipos painel e, em seguida, seleccione A aplicação de consola a partir de modelos. Na caixa nome no painel de modelos, escreva testES , que é o nome do projecto. Certifique-se que o botão Adicionar solução , que aparece na parte inferior da caixa de diálogo, está seleccionado. Clique em OK para adicionar este projecto para a solução.
  3. Para testES testar clsES, terá de adicionar uma referência. Na janela de soluções, clique com o botão direito do rato na pasta referências em testES o projecto, que acabou de adicionar. Seleccione Adicionar referência . Uma caixa de diálogo Adicionar referência do é apresentada.
  4. Seleccione o separador de projectos e, em seguida, faça duplo clique em prjEnterprise . Uma referência deverá aparecer em Componentes seleccionados , que está na parte inferior da caixa de diálogo. Clique em OK para adicionar esta referência a este projecto.
  5. Clique com o botão direito do rato a aplicação de consola, testES e, em seguida, seleccione Definir como arranque Project .
  6. No menu Debug , seleccione Windows . No submenu, seleccione imediata . Isto assegura que a janela Immediate está visível.
  7. Copie o seguinte código de teste num módulo Module1, substituindo as instruções Sub Main e End Sub. O módulo deve aparecer da seguinte forma:
        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. Prima F5 para executar o código de teste.
  9. No código no passo 7, a primeira chamada para dbAccess terá êxito. Um produto 1 e um produto 2 são na tabela produtos. O campo onOrder 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, a janela Immediate deverá apresentar a mensagem "TRANSACTION um - êxito".

    A segunda chamada dbAccess falha. Por este motivo, não uma das instruções de actualização no dbAccess para produtos tabela é registada na base de dados. Apesar do 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 definida na definição da tabela Produto, inStock não está autorizado a ter números negativos.

    Consequentemente, esta chamada para dbAccess falha, resultando numa falha da transacção completa. A Tabela Produtos permanece tal como estava antes da chamada para dbAccess. A instrução Apanha processa a notificação de falha de transacção de dbAccess, resultando numa mensagem de "TRANSACTION FAILURE" que está a ser apresentados na janela imediata.
Examine o conteúdo da tabela produtos de base de dados Adamastor utilizando o SQL Server Enterprise Manager. Quando visualiza o produto 1, campo onOrder é igual a 777, por produto 2, o instock campo é 888. Consequentemente, a segunda chamada para dbAccess resultaria em valores diferentes para estes campos, falhou.

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 de herdar do componente do serviço, que se encontra no espaço de nomes 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 obtém 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 o utilizador criar aplicações distribuídas
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Componentes do serviço
http://msdn.microsoft.com/en-us/library/aa289839.aspx

Propriedades

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