Cómo: Realizar una transacción distribuida con un proveedor de .NET utilizando ServicedComponent en Visual Basic .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 316627 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso muestra cómo realizar una transacción distribuida mediante un proveedor de .NET con la clase ServicedComponent . Aunque este artículo utiliza el proveedor de SqlClient .NET en un servidor de Microsoft SQL Server, también puede utilizar el proveedor administrado ODBC u OLE DB .NET.

Requisitos

En la lista siguiente se describe el hardware, el software, la infraestructura de red y los Service Packs recomendados que necesitará:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server 7.0 o SQL Server 2000

Información general

Las instancias de una clase de .NET Framework pueden participar en una transacción automática si prepara la clase para ello. Cada recurso que tiene acceso una instancia de clase o un objeto se inscribe en la transacción. Por ejemplo, si un objeto utiliza ADO.NET para enviar dinero en una cuenta en una base de datos, el Administrador de recursos de la base de datos determina si el objeto se ejecuta en una transacción. Si el objeto debe ejecutarse en una transacción, el Administrador de recursos inscribe automáticamente la base de datos en la transacción.

Utilice el proceso siguiente para preparar una clase para participar en una transacción automática:
  1. Aplicar la clase TransactionAttribute a la clase para especificar el tipo de transacción automática que solicita el componente.

    El tipo de transacción debe ser un miembro de la enumeración TransactionOption . Por ejemplo:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. Derive la clase de la clase ServicedComponent . ServicedComponent es la clase base de todas las clases que utilizar servicios COM +.
  3. Firmar el ensamblado con un nombre seguro para asegurarse de que el ensamblado contiene un único par de claves.
  4. Registrar el ensamblado que contiene la clase con el catálogo.

    Nota : si el cliente llama a una instancia de la clase se administra mediante common language runtime, se realiza el registro. Este paso es necesario sólo si un llamador no administrado crea y se llama a instancias de la clase. Utilizar la herramienta de instalación de servicios (Regsvcs.exe) de .NET para registrar manualmente el ensamblado.
Para obtener más información acerca de cómo firmar un ensamblado con un nombre seguro, vea el tema siguiente en el manual del programador de Microsoft .NET Framework:
Firmar un ensamblado con un nombre seguro
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
Para obtener más información acerca de este proceso, vea el tema siguiente en el manual del programador de .NET Framework:
Transacciones automáticas y clases de .NET Framework
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

Crear el proyecto

  1. Siga estos pasos para crear un nuevo proyecto de aplicación de consola en Visual Basic. NET:
    1. Inicie Visual Studio NET..
    2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto .
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual Basic bajo Tipos de proyecto , haga clic en Aplicación de consola en plantillas y, a continuación, haga clic en Aceptar .
    4. En el Explorador de soluciones, cambie el nombre del archivo Module1.vb DistributedTransaction.vb.
  2. Eliminar todo el código del archivo DistributedTransaction.vb.
  3. En el menú proyecto , haga clic en Agregar referencia y, a continuación, agregue las siguientes referencias:
    • System.EnterpriseServices
    • System.Data.dll

  4. Agregue el código siguiente al archivo DistributedTransaction.vb:
    Imports System
    Imports System.Data.SqlClient
    Imports System.EnterpriseServices
    Imports System.Runtime.CompilerServices
    Imports System.Reflection
    
    <Assembly: ApplicationName("DistributedTransaction")> 
    <Assembly: AssemblyKeyFileAttribute("..\..\DistributedTransaction.snk")> 
    
    
    Namespace DistributedTransaction
    
        '<summary>
        'Summary description for Class1.
        '</summary>
        Module Module1
            '<summary>
            'The main entry point for the application.
            '</summary>
            <STAThread()> Sub Main()
                Try
                    Dim myDistributedTran As New DistributedTran()
                    myDistributedTran.TestDistributedTransaction()
                Catch e As System.Data.SqlClient.SqlException
                    System.Console.WriteLine("Transaction Aborted: Error returned: " + e.Message)
                End Try
            End Sub
        End Module
    
        '<summary>
        'Summary description for TestApp.
        '</summary>
        <Transaction(TransactionOption.Required)> Public Class DistributedTran
            Inherits ServicedComponent
    
            Public Sub DistributedTran()
            End Sub
    
            <AutoComplete()> Public Function TestDistributedTransaction() As String
    
    
                'The following Insert statement goes to the first server.
                'This Insert statement does not produce any errors. 
                Dim insertCmdSql As String = "Insert Into TestTransaction (Col1, Col2) Values (1,'Sql Test')"
    
                'The following Delete statement goes to the second server.
                'Because the table does not exist, this code throws an exception. 
                Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    
                'The following connection strings create instances of two SqlConnection objects
                'to connect to two different SQL Server servers in your environment.
                'Modify the connection strings as necessary for your environment.
                Dim SqlConn1 As New SqlConnection("Server=Name_of_Server1;uid=User_Id;database=DatabaseName;pwd=Password")
                Dim SqlConn2 As New SqlConnection("Server=Name_of_Server2;uid=User_Id;database=DatabaseName;pwd=Password")
    
                Try
                    Dim insertCmd As New SqlCommand(insertCmdSql, SqlConn1)
                    Dim exceptionCausingCmd As New SqlCommand(exceptionCausingCmdSQL, SqlConn2)
    
                    'This command should run properly.
                    insertCmd.Connection.Open()
                    insertCmd.ExecuteNonQuery()
    
                    'This command results in an exception, which automatically rolls back
                    'the first command (the insertCmd command).
                    exceptionCausingCmd.Connection.Open()
                    Dim cmdResult As Integer = exceptionCausingCmd.ExecuteNonQuery()
    
                    SqlConn1.Close()
                    SqlConn2.Close()
    
                    Console.WriteLine("Hello")
    
                Catch ex As System.Data.SqlClient.SqlException
    
                    'After you catch the exception in this function, throw it.
                    'The service component receives this exception and aborts the
                    'transaction. The service component then throws the same exception,
                    'and the calling function receives the error message.
                    Console.WriteLine(ex.Message)
                    Throw (ex)
    
                Finally
    
                    'Close the connection.
                    If SqlConn1.State.ToString() = "Open" Then
                        SqlConn1.Close()
                    End If
    
                    If SqlConn2.State.ToString() = "Open" Then
                        SqlConn2.Close()
                    End If
    
                End Try
    
                Return "Success"
    
            End Function
    
        End Class
    End Namespace 
    					
  5. en el menú archivo , haga clic en Guardar.
  6. Haga clic en Inicio , seleccione programas , Visual Studio.NET , Herramientas de Visual Studio .NET y a continuación, haga clic en Visual Studio .NET .
  7. Abra la carpeta que contiene el proyecto y, a continuación, ejecute el comando siguiente para firmar el ensamblado con un nombre seguro:
    sn -k DistributedTransaction.snk
  8. Generar la aplicación.
  9. Crear la tabla siguiente en el primer servidor SQL server:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TestTransaction]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TestTransaction]
    GO
    
    CREATE TABLE [dbo].[TestTransaction] (
    	[Col1] [int] NULL ,
    	[Col2] [varchar] (100) NULL 
    ) ON [PRIMARY]
    GO 
    					
  10. Ejecute la aplicación. Observe que recibe el siguiente mensaje de error (que es el comportamiento esperado):
    Transacción anulada: Devolvió el error: nombre de objeto no válido 'NonExistentTable'.
  11. Abrir el Analizador de consultas de SQL Server, agregue el código siguiente y, a continuación, presione F5 para ejecutar la consulta:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    tenga en cuenta que la consulta no devuelve ninguna fila porque se anuló la transacción.
  12. Busque el código siguiente en el proyecto de Visual Basic:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    y reemplace la instrucción SQL con una consulta válida que no cause la transacción para anular. Por ejemplo:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. Presione F5 para compilar y ejecutar de nuevo la aplicación.
  14. Ejecute el comando del paso 11 en el Analizador de consultas de nuevo. Observe que la consulta devuelve una fila porque fue capaz de completar la transacción.
notas :
  • En este ejemplo no realiza el tratamiento de errores.
  • Deben ejecutar SQL Server y Microsoft Distributed Transaction Coordinator (MSDTC) en todos los clientes y servidores.

Referencias

Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
312902Cómo: Crear un componente con servicios .NET en Visual Basic .NET

Propiedades

Id. de artículo: 316627 - Última revisión: lunes, 24 de febrero de 2014 - Versión: 2.1
La información de este artículo se refiere a:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft .NET Framework Service Pack 2
  • Microsoft Enterprise Services (included with the .NET Framework 1.1)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
Palabras clave: 
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 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): 316627

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