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+.)
Para tornar UpdateAuthorAddress um componente transacional, as seguintes etapas são necessárias:
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.)
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.)
Tópicos relacionados