Compartir a través de


Paso 1: Crear un componente transaccional

Objetivos

En este paso, aprenderá lo siguiente:

  • Cómo escribir un componente transaccional en Microsoft Visual Basic
  • ¿Cuál es la configuración predeterminada para los servicios COM+?
  • Configuración de servicios COM+

Descripción

El componente UpdateAuthorAddress, el componente que se va a crear en esta sección, actualiza la dirección de un autor existente en la base de datos pubs. La base de datos pubs es una base de datos de ejemplo que se incluye con Microsoft SQL Server. Contiene información de publicación, como nombres de autor, direcciones y títulos de libro.

Nota

Pubs es el almacén de datos que se usa a lo largo de este manual.

 

Dado que UpdateAuthorAddress actualiza un almacén de datos, es aconsejable incluir el trabajo en una transacción, como se muestra en la ilustración siguiente, para que cuando un cliente llame al componente, COM+ inicia automáticamente una transacción e inscribe la base de datos (administrador de recursos) en esa transacción. (Para obtener información detallada sobre las transacciones en COM+, consulte Transacciones com+).

Diagrama que muestra una transacción COM+ con UpdateAuthorAddress.

Para que UpdateAuthorAddress sea un componente transaccional, se requieren los pasos siguientes:

  1. El componente debe escribirse. Para una protección adicional, se agrega una subrutina, comprobando que COM+ creó el objeto en una transacción. Además, el control básico de errores se incluye en el componente para simplificar la recuperación de errores. La comprobación de transacciones y el control de errores mejoran la confiabilidad del componente. (Vea El código de ejemplo del paso 1 para obtener una lista completa del componente UpdateAuthorAddress).

  2. Después de agregar el componente a una aplicación COM+ e instalar la aplicación, el atributo transaction debe establecerse en Required, lo que garantiza que COM+ crea cada objeto UpdateAuthorAddress en una transacción. Para obtener instrucciones sobre cómo establecer el atributo de transacción para un componente, consulte Establecimiento del atributo de transacción.

    Nota

    Al establecer el atributo de transacción en un componente, se define cómo crea COM+ cada objeto con respecto a las transacciones. Los valores de atributo transaction son Ignored, Not Supported, Supported, Required y Requires New. El valor Requerido no es uno de los valores de atributo predeterminados de un componente.

     

COM+ enlaza el servicio de transacciones con la activación y simultaneidad Just-In-Time (JIT). Al declarar que un componente es transaccional, COM+ también aplica la activación JIT y la protección de simultaneidad (sincronización).

Código de ejemplo

El componente UpdateAuthorAddress abre una conexión a la base de datos pubs, lo que permite al usuario modificar el nombre, la dirección o el estado del contrato de un autor. También llama a un segundo componente, que se describe en paso 2: Extender una transacción entre varios componentes.

Para usar el código siguiente en un proyecto de Microsoft Visual Basic, abra un nuevo proyecto de ActiveX.dll y agregue referencias a la biblioteca de objetos de datos de Microsoft ActiveX y a la biblioteca de tipos de servicios COM+.

Nota

El código de ejemplo de este manual es para fines de ilustración y puede que no sea el más eficaz para el almacenamiento provisional y la producción reales.

 

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

Resumen

  • COM+ asigna valores de atributo predeterminados. Puede volver a configurar la mayoría de los atributos de servicio.
  • Establecer el atributo de transacción de un componente en Required garantiza que COM+ debe crear cada instancia de ese componente en una transacción, pero no necesariamente inicia una nueva transacción.
  • La comprobación de la presencia de una transacción confirma que el valor del atributo de transacción del componente no se restablece accidentalmente a un valor no transaccional, como Ignore o Not Supported.
  • El control de errores hace que el componente sea más confiable y fácil de solucionar.
  • COM+ aplica los servicios de activación JIT y protección de simultaneidad para los componentes transaccionales.
  • Cerrar la conexión de base de datos cuando haya terminado con ella permite que otro componente de la misma transacción reutilice la conexión desde el grupo de conexiones. (La agrupación de conexiones no debe confundirse con la agrupación de objetos).

Paso 2: Extender una transacción entre varios componentes

Paso 3: Reutilizar componentes

Activación Just-In-Time de COM+

Sincronización de COM+

Configuración de transacciones

Creación de aplicaciones COM+

Establecimiento del atributo de transacción