Passaggio 1: Creazione di un componente transazionale
Obiettivi
In questo passaggio si apprenderà quanto segue:
- Come scrivere un componente transazionale in Microsoft Visual Basic
- Quali sono le impostazioni predefinite per i servizi COM+
- Come configurare i servizi COM+
Descrizione
Il componente UpdateAuthorAddress, il componente da creare in questa sezione, aggiorna l'indirizzo di un autore esistente nel database Pubs. Il database Pubs è un database di esempio fornito con Microsoft SQL Server. Contiene informazioni sulla pubblicazione, ad esempio nomi di autore, indirizzi e titoli di libri.
Nota
Pubs è l'archivio dati usato in questo primer.
Poiché UpdateAuthorAddress aggiorna un archivio dati, è consigliabile includere il lavoro in una transazione, come illustrato nella figura seguente, in modo che quando un client chiama il componente, COM+ avvia automaticamente una transazione e integra il database (resource manager) in tale transazione. Per informazioni dettagliate sulle transazioni in COM+, vedere Transazioni COM+)
Per rendere UpdateAuthorAddress un componente transazionale, sono necessari i passaggi seguenti:
Il componente deve essere scritto. Per una protezione aggiuntiva, viene aggiunta una subroutine, verificando che COM+ abbia creato l'oggetto in una transazione. Inoltre, la gestione degli errori di base è inclusa nel componente per semplificare il ripristino degli errori. La verifica delle transazioni e la gestione degli errori migliorano l'affidabilità del componente. Per un elenco completo del componente UpdateAuthorAddress, vedere Il codice di esempio del passaggio 1.
Dopo aver aggiunto il componente a un'applicazione COM+ e aver installato l'applicazione, l'attributo della transazione deve essere impostato su Required, che garantisce che COM+ crei ogni oggetto UpdateAuthorAddress in una transazione. Per istruzioni su come impostare l'attributo della transazione per un componente, vedere Impostazione dell'attributo della transazione.
Nota
L'impostazione dell'attributo di transazione su un componente definisce il modo in cui COM+ crea ogni oggetto in relazione alle transazioni. I valori degli attributi delle transazioni sono Ignored, Not Supported, Supported, Required e Requires New. Il valore Obbligatorio non è uno dei valori di attributo predefiniti di un componente.
COM+ associa il servizio transazioni con l'attivazione JIT (Just-In-Time) e la concorrenza. Quando si dichiara un componente transazionale, COM+ applica anche l'attivazione JIT e la protezione della concorrenza (sincronizzazione).
Codice di esempio
Il componente UpdateAuthorAddress apre una connessione al database Pubs, consentendo all'utente di modificare il nome, l'indirizzo o lo stato del contratto di un autore. Chiama anche un secondo componente, illustrato nel passaggio 2: Estensione di una transazione tra più componenti.
Per usare il codice seguente in un progetto Microsoft Visual Basic, aprire un nuovo progetto di ActiveX.dll e aggiungere riferimenti alla libreria di oggetti dati Microsoft ActiveX e alla libreria dei tipi di servizi COM+.
Nota
Il codice di esempio in questa guida di base è a scopo illustrativo e potrebbe non essere il più efficiente per la gestione temporanea e la produzione effettivi.
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
Riepilogo
- COM+ assegna valori di attributo predefiniti. È possibile riconfigurare la maggior parte degli attributi del servizio.
- L'impostazione dell'attributo di transazione di un componente su Required garantisce che COM+ deve creare ogni istanza di tale componente in una transazione, ma non avvia necessariamente una nuova transazione.
- La verifica della presenza di una transazione conferma che il valore dell'attributo della transazione del componente non è stato reimpostato inavvertitamente su un valore non transazionale, ad esempio Ignora o Non supportato.
- La gestione degli errori rende il componente più affidabile e più facile da risolvere.
- COM+ applica l'attivazione JIT e i servizi di protezione della concorrenza per i componenti transazionali.
- La chiusura della connessione al database al termine consente a un altro componente nella stessa transazione di riutilizzare la connessione dal pool di connessioni. Il pooling di Connessione non deve essere confuso con il pool di oggetti.
Argomenti correlati