如何在 Visual Basic.net 组件中使用 COM + 事务

文章翻译 文章翻译
文章编号: 315707 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文分步介绍如何使用 COM + (组件服务) 在 Visual Basic.net 类中的交易记录。作为一个单元被认为是一组数据库操作。该操作要么全部成功,或,如果将失败一次操作整个事务将失败。在后一种情况下已尝试任何数据库操作无法过帐到基础数据库。

要求

建议的硬件、 软件、 网络基础结构、 技能和知识和服务包,介绍了以下各项:
  • Microsoft Windows 2000 Server 运行 sp-1
  • Microsoft Internet Information Services (IIS) 版本 4.0 或更高版本
  • Microsoft ie 5.0、 5.5,或 6.0 版本
所需的预备知识:
  • 事务的概念和处理方面的知识
  • 熟悉 COM + (组件服务)

COM + 事务服务

System.EnterpriseServices 命名空间内,Microsoft.net 框架提供了实现事务处理功能。若要访问 COM + 事务的服务创建一个类通过执行以下步骤:
  1. 打开 Visual Studio.net。
  2. 创建一个新的类库项目命名 prjEnterprise 在 Visual Basic.net 中。Visual Basic.net 将创建一个名为 Class1 的公共类。
  3. 将对该项目的引用添加到 System.EnterpriseServices 库中。在解决方案资源管理器窗口中用鼠标右键单击 引用 文件夹,然后从快捷菜单中选择 添加引用。在 .net 选项卡上滚动,直至您找到 System.EnterpriseServices。双击 System.EnterpriseServices、 确保 System.EnterpriseServices 出现在选定的组件窗口中,然后单击 确定
  4. 使用 Imports 语句 System.EntpriseServices 命名空间和 System.Data.SqlClient 命名空间中,以便您不会完全限定对这些命名空间,以后在代码中的任何引用。这些语句必须出现在您的类文件中的任何其他语句之前要:
    	Imports System.EnterpriseServices
    Imports System.Data.SqlClient
  5. 为了使用 COM + 事务服务在类名为 clsES,必须继承功能从 ServicedComponent:
    	Public Class clsES
    Inherits ServicedComponent
  6. 事务 属性用于指定的事务处理支持的类级别:
    <Transaction(TransactionOption.Required)> Public Class clsES
       	Inherits ServicedComponent
  7. 创建一个内 clsES 称为 dbAccess 收到四个输入的整数参数的方法。前两个参数提供该产品的顺序的产品 ID 和单位。两个参数提供对该产品的产品 ID 和库存单位。此方法执行的一组数据库操作,对要被视为一个事务的这些指定的产品 id:
    	Public Sub dbAccess (ByVal pid1 As Integer, _
    ByVal onOrder As Integer, _
          ByVal pid2 As Integer, ByVal inStock As Integer)
  8. dbAccess 方法中创建 SQL 连接对象的罗斯文数据库,然后打开该连接。数据库操作发生通过使用此数据库:
    Dim Conn As New _
      SqlConnection("uid=sa;database=northwind;server=localhost")
    Conn.Open()
  9. 设置捕获可能发生的任何数据库处理 Try 块。必须捕获这些错误,以便能够中止事务。Try 块将每个更新指定的产品表记录中的其他字段包含两个的数据库操作
    		Try
  10. 执行第一个更新到产品表。更新 UnitsonOrder 字段 onOrder 产品 id,前两个输入参数中指定的值。一个 SQLcommand 用于运行此更新 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. 执行另一个更新到产品表。更新 UnitsinStock 字段的 inStock 产品 id,第三个和第四个输入参数中指定的值。一个 SQLCommand 用于运行此更新 SQL:
          sqlString = _
    "update products set UnitsinStock = " _
    & inStock & " where productId = " & pid2
               
          Cmd.CommandText = sqlString
          Cmd.ExecuteNonQuery()
  12. 因为这些更新是 COM + 事务的一部分,所以它们作为一个单元提交。将 setCompletecontextUtil 类从 System.EnterpriseServices 命名空间的使用方法提交事务--在此示例中两个的更新--如果不引发任何错误:
          ContextUtil.SetComplete()
  13. 罗斯文数据库连接已关闭:
          Conn.Close()
  14. 必须捕获运行 SQL 命令时出现的任何错误,以便可以中止整个事务:
    	   Catch e As Exception
  15. contextUtil 类 System.EnterpriseServices 命名空间中的该 setAbort 方法用于中止整个事务。如果第一个更新是成功,并且第二个更新将失败,都不能更新过帐到产品表中。捕获到的异常将抛给调用方,表明事务已失败:
          	ContextUtil.SetAbort()
    			Throw e
    		End Try
  16. 为了正常运行该组件的组件必须具有强名称。请按照下列步骤可生成强名称,并对具有强名称程序集进行签名:

    1. 若要打开 Visual Studio.net 命令提示符下,单击 开始,单击 程序、 单击 Microsoft Visual Studio.net,然后单击 Visual Studio.net 工具
    2. 命令提示符键入 sn.exe-k snEnterprise.snk 来为您的程序集提供强名称。

      具有强名称签名的程序集有关的详细信息,请参阅.net 框架 SDK 文档。
    3. 将 snEnterprise.snk 复制到项目文件夹中。
    4. 在 AssemblyInfo.vb,添加下面的代码行之前或之后其他程序集属性语句:
      <Assembly: AssemblyKeyFileAttribute("..\..\snEnterprise.snk")>
    5. 保存并生成项目。

完整代码列表

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

确认它可以工作

若要测试此代码,创建一个控制台应用程序,它使用 clsES。 在一个的情况下一个事务成功,和 onorderinstock 域为指定的产品的更新。在第二种情况下更新 onOrder 字段针对指定的产品的成功,但用于更新该 inStock 字段对于将失败产品,因为产品表中不存在指定的产品数量。这将导致一个交易记录失败与交易记录会被忽略。
  1. 添加新的控制台应用程序,应用程序名为 testES 到您的解决方案,以使解决方案包含 testES 项目和 prjEnterprise 项目。若要添加新项目,请在 文件 菜单上单击 新建,然后选择 项目
  2. 出现 新建项目 对话框。在 $ 项目中选择 Visual Basic 文件夹类型窗格和然后选择 控制台应用程序 从该模板。在模板窗格在 名称 框中键入 testES,这是项目的名称。请确保已选中将出现在对话框的底部,向解决方案中添加 按钮。单击 确定 以将此项目添加到解决方案。
  3. 为了测试 clsES testES 必须添加一个引用。在解决方案窗口中用鼠标右键单击是在项目 testES,您刚添加的下的 引用 文件夹。 选择 添加引用。出现 添加引用 对话框。
  4. 选择 项目 选项卡,然后双击 prjEnterprise。引用应出现在 选定的组件,即在下半部分的对话框中。单击 确定 以添加对此项目的引用。
  5. 用鼠标右键单击控制台应用程序 testES,然后选择 设为启动项目
  6. 调试 菜单上选择 $ 窗口。在在子选择 $ 立即。这样可确保在立即窗口是可见。
  7. 将下面的测试代码复制到模块模块 1,替换 Sub Main 和 End Sub 语句。该模块应如以下所示:
        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. 按 f5 键以运行测试的代码。
  9. 在第 7 步中的代码,dbAccess 在第一次调用成功。 产品 1 和产品 2 是产品表中。产品 1 的 onOrder 域会更新以 777,并在 inStock 字段改为 888 更新产品 2。因为此事务成功,立即窗口应该显示消息"事务 1-成功"。

    第二次调用 dbAccess 失败。因此,既不一个更新语句内 dbAccess 产品中的表发布到数据库。产品 2 产品 1 可能有其 onOrder 字段更新为 5,但不能有其 inStock 字段设置为-20。由于在产品表定义中内, 定义的约束的 inStock 不允许有负号。

    此调用 dbAccess 失败因此,从而导致整个事务失败。在产品表时保持 dbAccess 调用之前。Catch 语句处理从 dbAccess,从而导致邮件在立即窗口中显示的"事务失败"事务失败的通知。
通过使用 SQL Server 企业管理器检查罗斯文产品表中的内容。当您查看产品 1 时,onOrder 字段是 777 ; 产品 2,等于该 instock 字段是 888。因此,dbAccess,将导致这些字段的不同值,第二次调用失败。

故障排除

  • 请确保使用 COM + 服务的任何项目具有强名称。
  • 使用 COM + 服务的任何类必须从 System.EnterpriseServices 命名空间中找到该服务组件继承。
  • 同时调试之前提交或中止, 事务可能时间。若要不必超时使用事务属性上的超时属性。在下面的示例中,关联的方法获取 1,200 秒超时前完成任何交易记录:
    <Transaction(TransactionOption.Required, timeout:=1200) >

参考

其他的信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
COM + 集成: 如何.net 企业级服务可以帮助您生成分布式应用程序
http://msdn.microsoft.com/msdnmag/issues/01/10/complus/

服务的组件
http://msdn.microsoft.com/en-us/library/aa289839.aspx

属性

文章编号: 315707 - 最后修改: 2005年11月8日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft Visual .NET 2002 标准版
关键字:?
kbmt kbhowtomaster KB315707 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 315707
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