如何: 使用 Visual Basic.net 中的 ServicedComponent 执行用.net 提供程序的分布式的事务

文章翻译 文章翻译
文章编号: 316627 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

概要

本分步指南介绍演示如何通过使用.net 提供程序与 ServicedComponent 类执行一个分布式的事务。尽管本文使用 SqlClient.net 提供程序对 Microsoft SQL Server 服务器,但您还可以使用 ODBC 或 OLE DB.net 托管提供程序。

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和所需的服务包:
  • Microsoft Windows 2000 Professional Windows 2000 Server,Windows 2000 高级的服务器
  • Microsoft Visual Studio.net
  • Microsoft SQL Server 7.0 或 SQL Server 2000

概述

如果您准备要执行此类,.net 框架类的实例可以参与自动事务。在事务中登记的每个类实例或对象访问的资源。例如对于对象使用 ADO.NET 在数据库中的帐户上过帐资金,如果为数据库资源管理器确定对象是否在事务中运行。如果该对象应在事务中运行的资源管理器将自动登记在事务中的数据库。

使用以下过程准备参与自动事务的类:
  1. TransactionAttribute 类应用于您的类指定组件请求的自动交易记录类型。

    交易记录类型必须是 TransactionOption 枚举的成员。例如:
    <Transaction(TransactionOption.Required)> Public Class Bar
       Inherits ServicedComponent
       '. . .
    End Class
    					
  2. ServicedComponent 类派生您的类。ServicedComponent 是使用 COM + 服务的所有类的基类。
  3. 对要确保该程序集包含一个唯一的密钥对具有强名称程序集进行签名。
  4. 注册程序集包含您的类与 COM + 目录。

    : 如果调用您的类的实例的客户端由公共语言运行库,将为您执行注册。一个非托管调用方创建并调用您的类的实例时,才需要此步骤。使用.net 服务安装工具 (Regsvcs.exe) 来手动注册程序集。
有关如何使用强名称为程序集签名的详细信息请参阅下面的 Microsoft.net 框架开发人员指南 》 中的主题:
签名使用强名称为程序集
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp
有关此过程的详细信息,请参阅.net 框架开发人员指南 》 中下面的主题:
自动事务和.net 框架类
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconautomatictransactionsnetframeworkclasses.asp

创建项目

  1. 请按照下列步骤创建新的控制台应用程序项目在 Visual Basic.net 中操作:
    1. 启动 Visual Studio.net。
    2. 文件 菜单上指向 新建,然后单击 项目
    3. 新建项目 对话框中单击 项目类型 下的 Visual Basic 项目、 在 模板 框中,单击 控制台应用程序,然后单击 确定
    4. 在解决方案资源管理器中,Module1.vb 文件重命名为 DistributedTransaction.vb。
  2. 从 DistributedTransaction.vb 文件中删除的所有代码。
  3. 项目 菜单上单击 添加引用,然后添加以下参考资料:
    • System.EnterpriseServices
    • System.Data.dll

  4. 将下面的代码添加到 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. 文件 菜单上单击 全部保存
  6. 单击 开始,指向 程序、 指向 Microsoft Visual Studio.net、 指向 Visual Studio.net 工具,然后单击 Visual Studio.net 命令提示符
  7. 打开包含您的项目的文件夹,然后运行以下命令以使用强名称程序集签名:
    sn k DistributedTransaction.snk
  8. 生成应用程序。
  9. 在第一个 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. 运行应用程序。请注意您将收到以下错误消息 (这是预期的行为):
    返回事务中止: 错误: 无效的对象名称 NonExistentTable。
  11. 打开 SQL Server 查询分析器,添加下面的代码,然后按 f5 键运行该查询:
    USE NORTHWIND;
    SELECT * FROM TestTransaction WHERE Col1=1 AND Col2='Sql Test'
    						
    注意查询不返回任何行因为事务已中止。
  12. 在 Visual Basic 项目中找到下面的代码:
    Dim exceptionCausingCmdSQL As String = "Delete from NonExistentTable"
    						
    和 SQL 语句替换为有效的查询不会导致中止事务。例如:
    Dim exceptionCausingCmdSQL As String = "Select @@Identity from customers"
    					
  13. 按 f5 键编译并再次运行该应用程序。
  14. 从查询分析器中的第 11 步再次运行命令。请注意该查询将返回的行,因为事务无法成功完成。
说明
  • 本示例不会执行错误处理。
  • 必须在所有客户端和服务器上运行 SQL Server 和 Microsoft 分布式事务协调器 (MS DTC)。

参考

有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
312902如何: 创建 Visual Basic.net 中的.net 服务型的组件

属性

文章编号: 316627 - 最后修改: 2014年2月24日 - 修订: 2.1
这篇文章中的信息适用于:
  • 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 .NET 2002 标准版
  • Microsoft Visual Basic .NET 2003 标准版
关键字:?
kbnosurvey kbarchive kbmt kbcompiler kbhowtomaster kbsqlclient kbsystemdata KB316627 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 316627
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

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