Você está offline; aguardando reconexão

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

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
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Para uma versão deste artigo do Microsoft Visual Basic 6.0, consulte 261096.

NESTA TAREFA

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.

back to the top

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

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.EnterpriseServicesImports System.Data.SqlClient
  5. Para usar os serviços COM + transacional, sua classe, chamada clsES, deve herdar funcionalidade a partir ServicedComponent:
    	Public Class clsESInherits 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.
back to the top

Listagem de código completo

Imports System.Data.SqlClientImports System.EnterpriseServices<Transaction(TransactionOption.Required)> Public Class ClsES    Inherits ServicedComponentPublic 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
back to the top

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.

back to the top

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

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 315707 - Última Revisão: 12/07/2015 08:36:21 - Revisão: 3.2

Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition

  • kbnosurvey kbarchive kbmt kbhowtomaster KB315707 KbMtpt
Comentários