Cómo utilizar transacciones COM + en un componente de C#

Seleccione idioma Seleccione idioma
Id. de artículo: 816141 - 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 se describe cómo utilizar COM + transacciones de (servicios de componentes) en una clase de C#. Un conjunto de operaciones de base de datos se considera una unidad. Todas las operaciones se realice correctamente 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 intentaron ejecutar a la base de datos subyacente.

Requisitos

Los elementos siguientes describen el hardware recomendado, software, infraestructura de red, conocimientos y conocimientos y service packs que debe tener:
  • Microsoft Windows 2000 Server SP1
  • Microsoft Internet Information Services (IIS) versión 4.0 o posterior
  • Versiones de Microsoft Internet Explorer 5.0, 5.5 ó 6.0
Este artículo se supone que está familiarizado con lo siguiente:
  • Conceptos transaccionales y de procesamiento
  • COM + (servicios de componentes)

Servicios de transacción COM +

Puede implementar procesamiento con el espacio de nombres System.EnterpriseServices en Microsoft .NET Framework de transacciones. Para tener acceso a COM + servicios transaccionales, crear una clase. Para ello, siga estos pasos:
  1. Inicie Visual Studio .NET o Visual Studio 2005.
  2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
  3. Haga clic en Proyectos de Visual C# en Tipos de proyecto y, a continuación, haga clic en Biblioteca de clases en plantillas . Nombre del proyecto prjEnterprise .

    Nota En Visual Studio 2005, haga clic en C# en Tipos de proyecto y, a continuación, haga clic en Biblioteca de clases en plantillas . Nombre del proyecto prjEnterprise .
  4. De manera predeterminada se crea Class1.
  5. En el Explorador de soluciones, haga clic con el botón secundario en referencias y, a continuación, haga clic en Agregar referencia .
  6. Aparecerá el cuadro de diálogo Agregar referencia . En Nombre de componente en la ficha .NET , haga doble clic en System.EnterpriseServices .
  7. Asegúrese de que System.EnterpriseServices aparece bajo Componentes seleccionados . Haga clic en Aceptar .
  8. Agregue el código siguiente antes de a cualquier otra instrucción en el archivo Class1.cs:
    using System.EnterpriseServices;
    using System.Data.SqlClient;
  9. Agregar una nueva clase que se denomina clsES en el archivo de Class1.cs.
  10. Para utilizar los servicios transaccionales de COM +, la clase ( clsES ) debe heredar funcionalidad de ServicedComponent como sigue:
    public class clsES : ServicedComponent
  11. Un atributo de transacción se utiliza para especificar el nivel de compatibilidad transaccional de la clase como sigue:
    [Transaction(TransactionOption.Required)]public class clsES : ServicedComponent
  12. Cree un método en la clase clsES y denomínelo 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:
    void dbAccess(int pID1,int onOrder, int pID2, int inStock)
  13. 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. Se producen operaciones de base de datos utilizando la base de datos siguiente:

    Nota No olvide cambiar los siguientes parámetros de cadena de conexión para reflejar los valores correctos para el servidor de SQL Server.
    SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
    				Conn.Open();
    
  14. Establecer un bloque try para capturar las excepciones que pueden producirse durante el procesamiento de base de datos. Debe detectar estas excepciones para anular la transacción. El bloque try incluye dos operaciones de base de datos. Cada operación actualiza un campo distinto de un registro de tabla de productos especificados.
     try { 
    
  15. Realizar la primera actualización en la tabla products. Actualizar el campo UnitsonOrder con valor onOrder del producto con el identificador, como se especifica en los dos primeros parámetros de entrada. Utilice el siguiente comando SQL para ejecutar esta actualización SQL:
    SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
    				sqlCommand.ExecuteNonQuery();
  16. Realizar otra actualización en la tabla products. Actualizar el campo UnidadesEnStock con la inStock valor para el producto con el identificador, como se especifica en los parámetros de entrada de tercer y cuarto. Utilice el siguiente comando SQL para ejecutar esta actualización SQL:
    sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
    				sqlCommand.ExecuteNonQuery();
    
  17. Dado que estas actualizaciones son parte de una transacción, son confirmadas como una unidad. Se utiliza el método setComplete de la clase contextUtil desde el espacio de nombres System.EnterpriseServices para confirmar la transacción (en este caso las dos actualizaciones) si no se producen errores:
    ContextUtil.SetComplete();
  18. Se cierra la conexión a la base de datos Northwind:
    Conn.Close();
    }
  19. Debe detectar las excepciones que ocurren mientras se ejecuta los comandos SQL para que se puede anular la transacción completa:
    catch(Exception e){ 
  20. 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;
    }
  21. Para que este componente para que funcione correctamente, el componente debe tener un nombre seguro. Generar un nombre seguro y, a continuación, firme el ensamblado con nombre seguro. Para ello, siga estos pasos:
    1. En el símbolo de comandos de Visual Studio .NET, escriba sn.exe -k snEnterprise.snk para crear un archivo de clave. Para obtener más información acerca de firma de ensamblados con nombres seguros, consulte la documentación de .NET Framework SDK.
    2. Copiar snEnterprise.snk a su carpeta del proyecto.
    3. En AssemblyInfo.vc, agregar la siguiente línea de código antes o después otras instrucciones de atributo de ensamblado:
      [assembly: AssemblyKeyFileAttribute("..\\..\\snEnterprise.snk")]		
    4. Guardar y, a continuación, generar el proyecto.

Lista de código completa

Nota Remember to change the following connection string parameters to reflect the correct values for your SQL Server server.
using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.Common;
using System.EnterpriseServices;
using System.Data.SqlClient;

namespace prjEnterprise
{
	
	[Transaction(TransactionOption.Required)]public class clsES:ServicedComponent
	{
		public SqlConnection Conn;

		public void dbAccess(int pID1, int onOrder, int pID2, int inStock)
		{
			try
			{			
				SqlConnection Conn = new SqlConnection("user id=<username>;password=<strong password>;Initial Catalog=northwind;Data Source=2E124\\SQL;");
				Conn.Open();
				
SqlCommand sqlCommand = new SqlCommand("UPDATE myProducts SET UnitsonOrder = " + onOrder + " WHERE productID = " + pID1, Conn);
				sqlCommand.ExecuteNonQuery();
				
				sqlCommand.CommandText = "UPDATE myProducts SET UnitsinStock = " + inStock + " WHERE productID = " + pID2;
				sqlCommand.ExecuteNonQuery();

				ContextUtil.SetComplete();
				Conn.Close();
			}
			catch(Exception e)
			{
				ContextUtil.SetAbort();
			
				throw e;
			}
			finally
			{

			}
		}
	}	
}

Comprobar que funciona

Para probar este código, cree una aplicación de consola que utiliza el proyecto 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 y se omite la transacción.
  1. En Visual Studio .NET o Visual Studio 2005, seleccione nuevo en el menú archivo y, a continuación, haga clic en proyecto .
  2. Haga clic en Proyectos de Visual C# en Tipos de proyecto y, a continuación, haga clic en Aplicación de consola , bajo plantillas .

    Nota En Visual Studio 2005, haga clic en C# en Tipos de proyecto y, después, haga clic en Aplicación de consola en plantillas .
  3. En el cuadro de texto nombre , escriba testES . Asegúrese de que está seleccionada la opción Agregar a solución .
  4. Haga clic en Aceptar para agregar este proyecto a la solución.
  5. Para que testES probar clsES , debe agregar una referencia. En el Explorador de soluciones, haga clic con el botón secundario en referencias en testES (que acaba de agregar) y, a continuación, haga clic en Agregar referencia .
  6. Aparecerá el cuadro de diálogo Agregar referencia . En la ficha proyectos , haga doble clic en prjEnterprise .
  7. Una referencia aparece bajo seleccionado componentes . Haga clic en Aceptar para agregar esta referencia al proyecto.
  8. Agregue una referencia al proyecto a la biblioteca de System.EnterpriseServices. En el Explorador de soluciones, haga clic con el botón secundario en referencias y, a continuación, haga clic en Agregar referencia .
  9. Aparecerá el cuadro de diálogo Agregar referencia . En Nombre de componente en la ficha .NET , haga doble clic en System.EnterpriseServices .
  10. Asegúrese de que System.EnterpriseServices aparece bajo Componentes seleccionados . Haga clic en Aceptar .
  11. Haga clic con el botón secundario en la aplicación de consola ( testES ) y, a continuación, en establecer como proyecto de inicio
  12. Pegue el siguiente código de origen en la función Main de la clase Class1 :
    	prjEnterprise.clsES myTest = new prjEnterprise.clsES();
    
    				try 
    				{
    					myTest.dbAccess(1, 777, 2, 888);
    					Console.WriteLine("TRANSACTION ONE -- SUCCESS");
    
    					myTest.dbAccess(1, 5, 2, -20);
    					Console.WriteLine("TRANSACTION TWO -- SUCCESS");
    				}
    				catch (Exception e)
    				{
    					Console.WriteLine("TRANSACTION FAILURE");
    				}
  13. Presione F5 para ejecutar el código de prueba.

    En el código en el paso 7, la primera llamada a dbAccess se realiza correctamente. Producto 1 y 2 del producto se encuentran en la tabla productos. El campo onOrder para 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, recibirá el mensaje siguiente en la ventana de resultados
    TRANSACCIÓN UNO - ÉXITO


    La segunda llamada a dbAccess producirá errores. Por lo tanto, se registra ninguna instrucción de actualización en dbAccess a la tabla productos 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 se define en la definición de tabla de productos, de inStock no se pueden tener números negativos.

    Por tanto, esta llamada a dbAccess falla y toda la transacción falla. 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 y recibirá el siguiente mensaje de error en la ventana de resultados:
    ERROR DE TRANSACCIÓN
  14. 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. Cuando ve el producto 2, el instock campo es 888. Por lo tanto, la segunda llamada a dbAccess (que habría ocasionado distintos valores para estos campos) produce un error.

Solucionar 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. El componente 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 ejemplo siguiente, el método asociado tiene 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 generar aplicaciones distribuidas
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/default.aspx
Componentes facilitados como servicio
http://msdn2.microsoft.com/en-us/library/Aa289839(VS.71).aspx

Propiedades

Id. de artículo: 816141 - Última revisión: jueves, 22 de noviembre de 2007 - Versión: 4.3
La información de este artículo se refiere a:
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palabras clave: 
kbmt kbcomplusobj kbsqlprog kbsqlclient kbdatabase kbhowtomaster KB816141 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): 816141

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