Étape 1 : Création d’un composant transactionnel
Objectifs
Dans cette étape, vous allez découvrir les éléments suivants :
- Comment écrire un composant transactionnel dans Microsoft Visual Basic
- Quels sont les paramètres par défaut des services COM+
- Guide pratique pour configurer les services COM+
Description
Le composant UpdateAuthorAddress, le composant à créer dans cette section, met à jour l’adresse d’un auteur existant dans la base de données Pubs. La base de données Pubs est un exemple de base de données fourni avec Microsoft SQL Server. Il contient des informations de publication telles que les noms d’auteur, les adresses et les titres de livre.
Remarque
Pubs est le magasin de données utilisé tout au long de ce primeur.
Étant donné que UpdateAuthorAddress met à jour un magasin de données, il est conseillé d’inclure le travail dans une transaction, comme illustré dans l’illustration suivante, de sorte que lorsqu’un client appelle le composant, COM+ démarre automatiquement une transaction et inscrit la base de données (gestionnaire de ressources) dans cette transaction. (Pour plus d’informations sur les transactions dans COM+, consultez COM+ Transactions.)
Pour rendre UpdateAuthorAddress un composant transactionnel, les étapes suivantes sont requises :
Le composant doit être écrit. Pour une protection supplémentaire, une sous-routine est ajoutée, en vérifiant que COM+ a créé l’objet dans une transaction. En outre, la gestion des erreurs de base est incluse dans le composant pour simplifier la récupération des erreurs. La vérification des transactions et la gestion des erreurs renforcent la fiabilité du composant. (Consultez l’exemple de code étape 1 pour obtenir une liste complète du composant UpdateAuthorAddress.)
Après avoir ajouté le composant à une application COM+ et installé l’application, l’attribut de transaction doit être défini sur Obligatoire, ce qui garantit que COM+ crée chaque objet UpdateAuthorAddress dans une transaction. Pour obtenir des instructions sur la définition de l’attribut de transaction pour un composant, consultez Définition de l’attribut transactionnel.
Remarque
La définition de l’attribut de transaction sur un composant définit la façon dont COM+ crée chaque objet en ce qui concerne les transactions. Les valeurs d’attribut de transaction sont ignorées, non prises en charge, prises en charge, obligatoires et nécessitent de nouvelles. La valeur obligatoire n’est pas l’une des valeurs d’attribut par défaut d’un composant.
COM+ lie le service de transaction avec l’activation juste-à-temps (JIT) et la concurrence. Lorsque vous déclarez un composant à transactionnel, COM+ applique également l’activation JIT et la protection de concurrence (synchronisation).
Exemple de code
Le composant UpdateAuthorAddress ouvre une connexion à la base de données Pubs, ce qui permet à l’utilisateur de modifier le nom, l’adresse ou l’état du contrat d’un auteur. Il appelle également un deuxième composant, qui est abordé à l’étape 2 : Extension d’une transaction entre plusieurs composants.
Pour utiliser le code suivant dans un projet Microsoft Visual Basic, ouvrez un nouveau projet ActiveX.dll et ajoutez des références à la bibliothèque d’objets de données Microsoft ActiveX et à la bibliothèque de types de services COM+.
Remarque
L’exemple de code de ce primeur est destiné à des fins d’illustration et peut ne pas être le plus efficace pour la mise en production et la mise en production réelles.
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
Résumé
- COM+ affecte les valeurs d’attribut par défaut. Vous pouvez reconfigurer la plupart des attributs de service.
- La définition de l’attribut de transaction d’un composant pour garantir que COM+ doit créer chaque instance de ce composant dans une transaction, mais ne démarre pas nécessairement une nouvelle transaction.
- La vérification de la présence d’une transaction confirme que la valeur de l’attribut transactionnel du composant n’a pas été réinitialisée par inadvertance à une valeur non transactionnelle, telle que Ignorer ou non prise en charge.
- La gestion des erreurs rend votre composant plus fiable et plus facile à résoudre.
- COM+ applique les services d’activation JIT et de protection de l’accès concurrentiel pour les composants transactionnels.
- La fermeture de la connexion de base de données lorsque vous l’avez terminée permet à un autre composant de la même transaction de réutiliser la connexion à partir du pool de connexions. (Le regroupement de connexions ne doit pas être confondu avec le regroupement d’objets.)
Rubriques connexes