Compartilhar via


Etapa 1: Criando um componente transacional

Objetivos

Nesta etapa, você aprenderá o seguinte:

  • Como escrever um componente transacional no Microsoft Visual Basic
  • Quais são as configurações padrão para serviços COM+
  • Como configurar serviços COM+

Descrição

O componente UpdateAuthorAddress, o componente a ser criado nesta seção, atualiza o endereço de um autor existente no banco de dados Pubs. O banco de dados Pubs é um banco de dados de exemplo fornecido com o Microsoft SQL Server. Ele contém informações de publicação, como nomes de autores, endereços e títulos de livros.

Observação

Pubs é o armazenamento de dados que é usado em toda esta cartilha.

 

Como UpdateAuthorAddress atualiza um armazenamento de dados, é aconselhável incluir o trabalho em uma transação, conforme mostrado na ilustração a seguir, para que, quando um cliente chamar o componente, COM+ inicie automaticamente uma transação e aliste o banco de dados (gerenciador de recursos) nessa transação. (Para obter informações detalhadas sobre transações no COM+, consulte Transações COM+.)

Diagram that shows a COM+ transaction with UpdateAuthorAddress.

Para tornar UpdateAuthorAddress um componente transacional, as seguintes etapas são necessárias:

  1. O componente deve ser escrito. Para proteção extra, uma sub-rotina é adicionada, verificando se COM+ criou o objeto em uma transação. Além disso, o tratamento de erros básicos está incluído no componente para simplificar a recuperação de erros. A verificação de transações e o tratamento de erros aumentam a confiabilidade do componente. (Consulte Código de exemplo da etapa 1 para obter uma lista completa do componente UpdateAuthorAddress.)

  2. Depois de adicionar o componente a um aplicativo COM+ e instalar o aplicativo, o atributo transaction deve ser definido como Required, o que garante que COM+ crie cada objeto UpdateAuthorAddress em uma transação. Para obter instruções sobre como definir o atributo de transação para um componente, consulte Definindo o atributo de transação.

    Observação

    A definição do atributo transaction em um componente define como COM+ cria cada objeto em relação às transações. Os valores de atributo de transação são Ignorado, Não Suportado, Suportado, Obrigatório e Requer Novo. O valor Required não é um dos valores de atributo padrão de um componente.

     

COM+ vincula o serviço de transação com ativação just-in-time (JIT) e simultaneidade. Quando você declara um componente como transacional, o COM+ também impõe a ativação JIT e a proteção de simultaneidade (sincronização).

Código de exemplo

O componente UpdateAuthorAddress abre uma conexão com o banco de dados Pubs, permitindo que o usuário modifique o nome, o endereço ou o status do contrato de um autor. Ele também chama um segundo componente, que é discutido na Etapa 2: Estendendo uma transação entre vários componentes.

Para usar o código a seguir em um projeto do Microsoft Visual Basic, abra um novo projeto ActiveX.dll e adicione referências à Biblioteca de Objetos de Dados do Microsoft ActiveX e à Biblioteca de Tipos de Serviços COM+.

Observação

O código de exemplo neste primer é para fins de ilustração e pode não ser o mais eficiente para preparo e produção reais.

 

Option Explicit
'
'  Purpose:   This class is used for updating an author's address.
'
'  Notes:     IMPT:  This component implicitly assumes that it will 
'             always run in a transaction. Undefined results may 
'             otherwise occur.
'

'----------------------------------------------------------
'  VerifyInTxn subroutine
'      Verifies that this component is in a transaction.
'      Throws an error if it is not.
'
Private Sub VerifyInTxn()
  If Not GetObjectContext.IsInTransaction Then
    ' Transactions turned off. 
    Err.Raise 99999, "This component", "I need a transaction!"
  End If
  ' Component is in a transaction.
End Sub

'----------------------------------------------------------
'  UpdateAuthorAddress subroutine
'      Procedure to update an author's address.
'
Public Sub UpdateAuthorAddress( _
                        ByVal strAuthorID As String, _
                        ByVal strPhone As String, _
                       ByVal strAddress As String, _
                        ByVal strCity As String, _
                        ByVal strState As String, _
                        ByVal strZip As String)
  ' Handle any errors.
  On Error GoTo UnexpectedError
  
  ' Verify that component is in a transaction.
  VerifyInTxn
  
  ' Get object context.
  Dim objcontext As COMSVCSLib.ObjectContext
  Set objcontext = GetObjectContext
  
  ' Get the IContextState object.
  Dim contextstate As COMSVCSLib.IContextState
  Set contextstate = objcontext
  
  ' Validate the new address information.
  ' The ValidateAuthorAddress function is described in Step 2.
  Dim oValidateAuthAddr As Object
  Dim bValidAddr As Boolean
  Set oValidateAuthAddr = _
    CreateObject("ComplusPrimer.ValidateAuthorAddress") 
  bValidAddr = oValidateAuthAddr.ValidateAuthorAddress( _
    strAddress, strCity, strState, strZip)
  If Not bValidAddr Then
    Err.Raise 99999, "The UpdateAuthorAddress component", _
      "The address of the author is incorrect!"
  End If
  
  ' Open the connection to the database.
  Dim conn As ADODB.Connection
  Set conn = CreateObject("ADODB.Connection")

  ' Specify the OLE DB provider.
  conn.Provider = "SQLOLEDB"

  ' Connect using Windows Authentication.
  Dim strProv As String
  strProv = "Server=MyDBServer;Database=pubs;Trusted_Connection=yes"

  ' Open the database.
  conn.Open strProv

  ' Execute the query.
  conn.Execute "update authors set phone= '" & strPhone & "'" & _
               " set address= '" & strAddress & "'" & _
               " set city= '" & strCity & "'" & _
               " set state= '" & strState & "'" & _
               " set zip= '" & strZip & "'" & _
               " where au_id = '" & strAuthorID & "'"
               
  ' Close the connection.
  conn.Close
  
  ' Get rid of the connection.
  Set conn = Nothing
                 
  ' Everything works--commit the transaction.
  contextstate.SetMyTransactionVote TxCommit
  contextstate.SetDeactivateOnReturn True
  Exit Sub
  
UnexpectedError:
  ' There's an error.
  contextstate.SetMyTransactionVote TxAbort
  contextstate.SetDeactivateOnReturn True
End Sub

Resumo

  • COM+ atribui valores de atributo padrão. Você pode reconfigurar a maioria dos atributos de serviço.
  • Definir o atributo transaction de um componente como Required garante que COM+ deve criar cada instância desse componente em uma transação, mas não necessariamente inicia uma nova transação.
  • A verificação da presença de uma transação confirma que o valor do atributo de transação do componente não foi inadvertidamente redefinido para um valor não transacional, como Ignorar ou Não Suportado.
  • O tratamento de erros torna seu componente mais confiável e fácil de solucionar problemas.
  • O COM+ impõe serviços de ativação JIT e proteção de simultaneidade para componentes transacionais.
  • Fechar a conexão de banco de dados quando você terminar de usá-la permite que outro componente na mesma transação reutilize a conexão do pool de conexões. (O pool de conexões não deve ser confundido com o pool de objetos.)

Etapa 2: Estendendo uma transação entre vários componentes

Etapa 3: Reutilizar componentes

Ativação Just-in-Time COM+

Sincronização COM+

Configurando transações

Criando aplicativos COM+

Definindo o atributo de transação