首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Excel启动TransactionScope?

问从Excel启动TransactionScope?
EN

Stack Overflow用户
提问于 2014-06-04 23:00:47
回答 1查看 330关注 0票数 7

我有一些现有的c#代码,我想通过com互操作公开,这样就可以从Excel调用它。由于我将执行许多嵌套的批处理更新操作,我需要支持事务,并且为了最小化c#级别上所需的重构,我想使用TransactionScope方法:

使用事务作用域实现隐式事务

http://msdn.microsoft.com/en-us/library/ms172152.aspx

TransactionScope类提供了一种简单的方法,可以将代码块标记为参与事务,而无需与事务本身交互。事务范围可以自动选择和管理环境事务。由于它的易用性和效率,建议您在开发事务应用程序时使用TransactionScope类。 此外,您不需要在事务中显式地使用资源。任何System.Transactions资源管理器(例如Server 2005)都可以检测由作用域创建的环境事务的存在并自动登记。

我的问题是:是否可以在VBA代码中启动TransactionScope (或者通过COM互操作调用c#方法来实例化和返回TransactionScope对象),然后继续通过code调用其他各种c#对象,这些对象都将自动参与单个根事务?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 09:25:32

我不认为你的做法有任何问题。在VBA中没有using,所以必须通过

  • 使用错误处理程序和
  • 非常小心,不要离开方法而不以某种方式处理TransactionScope。

例如,假设在C#应用程序中提供了以下方法:

代码语言:javascript
复制
public TransactionScope BeginTransactionScope()
{
    return new TransactionScope();
}

public void CommitTransactionScope(TransactionScope scope)
{
    scope.Complete();
    scope.Dispose();  // simulates leaving the using { ... } scope
}

public void RollbackTransactionScope(TransactionScope scope)
{
    scope.Dispose();  // simulates leaving the using { ... } scope
}

// Does some work using Connections and maybe nested scopes
public void DoSomeWork1() { ... }
public void DoSomeWork2() { ... }
public void DoSomeWork3() { ... }

您可以编译C# DLL并通过COM互操作将其提供给Excel。在VBA中,可以按以下方式运行这些方法:

代码语言:javascript
复制
Private Sub MySub()

    On Error Goto MyErrorHandler

    ...
    Dim scope As Object
    Set scope = myCsObject.BeginTransactionScope()
    ...
    myCsObject.DoSomeWork1
    ...
    myCsObject.DoSomeWork2
    ...
    myCsObject.DoSomeWork3
    ...
    myCsObject.CommitTransactionScope scope
    Set scope = Nothing
    ...

    Exit Sub

MyErrorHandler:
    If Not (scope Is Nothing) Then
        myCsObject.RollbackTransactionScope scope
    End If
    ' Remainder of your error handler goes here
    ...
End Sub

但是请注意,您使用VBA代码执行的任何数据访问(在DoSomeWork调用之间)都在事务范围之外,因为TransactionScope与传统的ADO或DAO不兼容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24049000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档