Cómo utilizar transacciones COM + en un componente de Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 315707 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso muestra cómo utilizar COM + (Component Services) transacciones en una clase de Visual Basic.NET. Un conjunto de operaciones de base de datos se considera como una unidad. Las operaciones todas tengan éxito o, si se produce un error en una operación, falla la transacción completa. En el último caso, no se registran las operaciones de base de datos que se han intentado a la base de datos subyacente.

Requisitos

Los elementos siguientes describen el hardware recomendado, software, infraestructura de red, conocimientos y conocimientos y service packs:
  • Microsoft Windows 2000 Server ejecutando el Service Pack 1
  • Microsoft Internet Information Services (IIS) versión 4.0 o posterior
  • Microsoft Internet Explorer versión 5.0, 5.5 ó 6.0
Conocimientos previos necesarios:
  • Conocimiento de conceptos transaccionales y de procesamiento
  • Familiaridad con COM + (servicios de componentes)

Servicios COM + transaccionales

El espacio de nombres de System.EnterpriseServices dentro de Microsoft .NET framework proporciona la funcionalidad para implementar el procesamiento de transacciones. Para obtener acceso para COM + servicios transaccionales, cree una clase; para ello, siga estos pasos:
  1. Abra Visual Studio NET..
  2. Cree un nuevo proyecto de biblioteca de clase denominado prjEnterprise en Visual Basic. NET. Visual Basic.NET crea una clase pública que se denomina Class1.
  3. Agregue una referencia al proyecto a la biblioteca de System.EnterpriseServices. En la ventana Explorador de soluciones, haga clic con el botón secundario en la carpeta referencias y, a continuación, seleccione Agregar referencia en el menú contextual. En la ficha .NET , desplácese hasta que encuentre System.EnterpriseServices . Haga doble clic en System.EnterpriseServices , asegúrese de que System.EnterpriseServices aparece en la ventana componentes seleccionados y, a continuación, haga clic en Aceptar .
  4. Utilice la instrucción Imports para el espacio de nombres System.EntpriseServices y el espacio de nombres System.Data.SqlClient , por lo que no tenga que calificar totalmente todas las referencias a estos espacios de nombres más adelante en el código. Estas instrucciones deben aparecer antes a cualquier otra instrucción en el archivo de clase:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. Para utilizar los servicios transaccionales de COM +, la clase, denominada clsES, debe heredarse funcionalidad de ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. Un atributo de transacción se utiliza para especificar el nivel de compatibilidad transaccional de la clase:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. Cree un método dentro de clsES denominado dbAccess recibe cuatro parámetros de entrada de número entero. Los dos primeros parámetros proporcionan un identificador de producto y las unidades en pedido para ese producto. Los dos parámetros proporcionan un identificador de producto y las unidades en existencias para ese producto. Este método realiza un conjunto de operaciones de base de datos en estos identificadores de producto especificado en el que se tratarán como una transacción:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. En el método dbAccess , cree un objeto de conexión de SQL para Northwind la base de datos y, a continuación, abrir la conexión. Las operaciones de base de datos tienen lugar utilizando esta base de datos:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. Establecer un bloque try para capturar cualquier procesamiento de base de datos que puede producirse. Estos errores se deben capturar en para poder anular la transacción. El bloque try incluirá dos operaciones de base de datos, cada uno de actualizar un campo distinto de un registro de tabla de productos especificado.
    		Try
  10. Realizar la primera actualización en la tabla products. Actualizar el campo UnitsonOrder con el valor de onOrder de producto con el identificador, como se especifica en los dos primeros parámetros de entrada. Se utiliza un SQLcommand para ejecutar esta actualización de SQL:
    	   Dim Cmd As SqlCommand
          Dim sqlString As String = _
               "update products set UnitsonOrder = " & onOrder _
               & " where productId = " & pid1         
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()
  11. Realizar otra actualización en la tabla products. Actualizar el campo UnidadesEnStock con el valor de inStock de producto con el identificador, como se especifica en los parámetros de entrada de tercer y cuarto. Se utiliza un SQLCommand para ejecutar esta actualización de SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. Dado que estas actualizaciones son parte de una transacción, son confirmadas como una unidad. El método setComplete de la clase contextUtil desde el espacio de nombres System.EnterpriseServices se utiliza para confirmar la transacción--en este caso, las dos actualizaciones--si no se producen errores:
          ContextUtil.SetComplete()
  13. Se cierra la conexión a la base de datos Northwind:
          Conn.Close()
  14. Errores que se producen mientras se ejecuta los comandos SQL deben detectarse, por lo que puede se anuló la transacción completa:
    	   Catch e As Exception
  15. Se utiliza el método setAbort de la clase contextUtil desde el espacio de nombres System.EnterpriseServices para anular la transacción completa. Si la primera actualización es correcta y la segunda actualización falla, se registra ninguna actualización en la tabla products. Se produce la excepción detectada al llamador, que indica que la transacción se produjo un error:
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. Este componente para que funcione correctamente, el componente debe tener un nombre seguro. Siga estos pasos para generar un nombre seguro y para firmar el ensamblado con nombre seguro:

    1. Para abrir un símbolo del sistema de Visual Studio. NET, haga clic en Inicio , haga clic en programas , haga clic en Visual Studio.NET y, a continuación, haga clic en Herramientas de Visual Studio .NET .
    2. En el símbolo del sistema, escriba sn.exe -k snEnterprise.snk para darle al ensamblado un nombre seguro.

      Para obtener más información acerca de firma de ensamblados con nombres seguros, consulte la documentación de .NET Framework SDK.
    3. Copie snEnterprise.snk a la carpeta de proyecto.
    4. En AssemblyInfo.vb, agregar la siguiente línea de código antes o después otras instrucciones de atributo de ensamblado:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. Guarde y genere el proyecto.

Listado de código completo

Imports System.Data.SqlClient
Imports System.EnterpriseServices

<Transaction(TransactionOption.Required)> Public Class ClsES
    Inherits ServicedComponent

Public Sub dbAccess(ByVal pid1 As Integer, ByVal onOrder As Integer, _
      ByVal pid2 As Integer, ByVal inStock As Integer)

        Dim Conn As New _
          SqlConnection("uid=sa;database=northwind;server=localhost")
          Conn.Open()
        Try
          Dim Cmd As SqlCommand
          Dim sqlString As String = _
             "update products set UnitsonOrder = " & _
              onOrder & " where productId = " & pid1
          Cmd = New SqlCommand(sqlString, Conn)
          Cmd.ExecuteNonQuery()

          sqlString = _

         " update products set UnitsinStock = " & inStock & _
                " where productId = " & pid2
           Cmd.CommandText = sqlString
           Cmd.ExecuteNonQuery()

           ContextUtil.SetComplete()
           Conn.Close()
        
         Catch e As Exception
            ContextUtil.SetAbort()
		  Throw e
        End Try
    End Sub 
End Class

Comprobar que funciona

Para probar este código, cree una aplicación de consola que utiliza clsES. En un caso, una transacción tiene éxito y el onorder y instock campos para el producto especificado se actualizan. En el segundo caso, la actualización del campo onOrder para un producto especificado se realiza correctamente, pero la actualización para el inStock campo para un producto falla, porque el número de producto especificada no existe en la tabla productos. Esto produce un error de transacción, con la transacción se omiten.
  1. Agregar una nueva aplicación de consola denominada testES a la solución, para que la solución contiene el proyecto testES y el proyecto prjEnterprise. Para agregar el nuevo proyecto, haga clic en nuevo en el menú archivo y, a continuación, seleccione proyecto .
  2. Aparece un cuadro de diálogo Nuevo proyecto . Seleccione la carpeta Visual Basic en el proyecto tipos panel y, a continuación, seleccione Aplicación de consola desde las plantillas. En el cuadro nombre en el panel Plantillas, escriba testES , que es el nombre del proyecto. Asegúrese de que está seleccionado el botón Agregar a solución , que aparece al final del cuadro de diálogo. Haga clic en Aceptar para agregar este proyecto a la solución.
  3. En pedido para testES probar clsES, debe agregar una referencia. En la ventana soluciones, haga clic con el botón secundario del mouse en la carpeta de referencias que está bajo testES de proyecto, que sólo agrega. Seleccione agrega referencia . Aparecerá un cuadro de diálogo Agregar referencia .
  4. Seleccione la ficha proyectos y, a continuación, haga doble clic en prjEnterprise . Debería aparecer una referencia en Componentes seleccionados , que es en la parte inferior del cuadro de diálogo. Haga clic en Aceptar para agregar esta referencia a este proyecto.
  5. Haga clic con el botón secundario del mouse en la aplicación de consola testES y seleccione establecer como inicio proyecto .
  6. en el menú Depurar , seleccione. En el submenú, seleccione Inmediato . Esto garantiza que la ventana Inmediato es visible.
  7. Copie el código prueba siguiente en Module1 de módulo, reemplazando las instrucciones Sub Main y End Sub. El módulo debe aparecer como sigue:
        Sub Main()
            Dim myTest As New prjEnterprise.clsES()
    
            Try
                myTest.dbAccess(1, 777, 2, 888)
                Debug.WriteLine("TRANSACTION ONE -- SUCCESS")
               
                myTest.dbAccess(1, 5, 2, -20)
                Debug.WriteLine("TRANSACTION TWO -- SUCCESS")
            
            Catch
                Debug.WriteLine("TRANSACTION FAILURE")
            End Try
        End Sub
  8. Presione F5 para ejecutar el código de prueba.
  9. En el código en el paso 7, la primera llamada a dbAccess se realiza correctamente. Un producto 1 y un producto 2 están en la tabla productos. El campo onOrder para el producto 1 se actualiza a 777 y el inStock campo para el producto 2 se actualiza a 888. Debido a esta transacción se realizó correctamente, la ventana Inmediato debe mostrar el mensaje "TRANSACTION ONE - correcto".

    La segunda llamada a dbAccess producirá errores. Por lo tanto, ninguno de las instrucciones de actualización dentro de dbAccess a los productos se contabiliza la tabla en la base de datos. Aunque producto 1 podría tener su campo onOrder actualizado a 5, producto 2 no puede tener su inStock campo establecido en-20. Debido a una restricción que está definida dentro de la definición de tabla de productos, de inStock no se puede tener los números negativos.

    Por consiguiente, esta llamada a dbAccess falla, lo que produce el error de transacción completa. La Tabla productos permanece tal y como era antes de la llamada a dbAccess. La instrucción catch controla la notificación del error de transacción de dbAccess, lo que el mensaje "Error de TRANSACTION" se muestren en la ventana inmediata.
Examine el contenido de la tabla Products de Northwind utilizando el Administrador corporativo de SQL Server. Al ver producto 1, el campo onOrder es igual a 777; para el producto 2, el instock campo es 888. Por tanto, ha error en la segunda llamada a dbAccess, que habría ocasionado distintos valores para estos campos.

Solución de problemas

  • Asegúrese de que cualquier proyecto que utiliza los servicios COM + tiene un nombre seguro.
  • Cualquier clase que utiliza los servicios COM + debe heredar del componente revisado, que se encuentra en el espacio de nombres System.EnterpriseServices .
  • Durante la depuración, una transacción puede tiempo de espera antes de que se confirme o anulado. Para evitar un tiempo de espera, utilice una propiedad de tiempo de espera en el atributo de transacción. En el siguiente, el método asociado obtiene 1200 segundos para finalizar cualquier transacción hasta que se agota:
    <Transaction(TransactionOption.Required, timeout:=1200) >

Referencias

Para obtener información adicional, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
COM + Integration: How .NET Enterprise Services pueden ayudarle a generar aplicaciones distribuidas
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

Componentes facilitados como servicio
http://msdn.microsoft.com/en-us/library/aa289839.aspx

Propiedades

Id. de artículo: 315707 - Última revisión: martes, 8 de noviembre de 2005 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbmt kbhowtomaster KB315707 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 315707

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com