我有一些现有的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#对象,这些对象都将自动参与单个根事务?
发布于 2014-06-20 09:25:32
我不认为你的做法有任何问题。在VBA中没有using,所以必须通过
例如,假设在C#应用程序中提供了以下方法:
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中,可以按以下方式运行这些方法:
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不兼容。
https://stackoverflow.com/questions/24049000
复制相似问题