【问题标题】:VB6 Transaction within .NET transaction.NET 事务中的 VB6 事务
【发布时间】:2012-07-24 22:27:38
【问题描述】:

我有一个 ASP.NET WCF Web 服务,它从另一个服务获取数据并通过事务将其保存在数据库中。即所有数据要么保存在数据库中(提交),要么什么都不保存(回滚)。

我需要在数据库中保存数据的过程中添加一个新阶段,该阶段涉及调用 VB6 dll 中的函数,该 dll 也使用事务连接到同一数据库。这可能吗?

这是用于调用 VB6 函数的 .NET 代码:

object oMissing = System.Reflection.Missing.Value;
ADODB.Recordset rsKR = new ADODB.Recordset();
rsKR.Fields.Append("F1", ADODB.DataTypeEnum.adVarChar, 10, ADODB.FieldAttributeEnum.adFldFixed, null);
rsKR.Fields.Append("F2", ADODB.DataTypeEnum.adVarChar, 10, ADODB.FieldAttributeEnum.adFldFixed, null);

rsKR.Open(oMissing, oMissing, ADODB.CursorTypeEnum.adOpenStatic,    ADODB.LockTypeEnum.adLockOptimistic, -1);
rsKR.AddNew(oMissing, oMissing);

rsKR.Fields["F1"].Value = someObject.Id;
rsKR.Fields["F2"].Value = someObject.Name;

rsKR.Update(oMissing, oMissing);
rsKR.MoveFirst();

VB6Project.ClassAPI objVBAPI = new VB6Project.ClassAPI();
objVBAPI.InsertIntoDBFunction(rsKR);

提前谢谢..

【问题讨论】:

  • 我尝试从 .NET 服务调用 VB6 dll 并且运行良好,但是当 VB6 进入在数据库中插入数据的阶段时出现异常。
  • 所以您的 Vb6 DLL 中的其他函数工作正常,但当它尝试向您的数据库中插入数据时它会崩溃?
  • 是的,就是这样
  • 您的 VB6 DLL COM+ 是否启用?
  • 我讨厌复杂的计算,复杂的计算能有多复杂?当然,它们不能太复杂,以至于您无法将复杂的计算移植到 .NET。谁知道呢,也许当你浏览它们时,你可以让它们变得不那么复杂?

标签: c# wcf vb6


【解决方案1】:

您需要做的是使用 .Net TransactionScope 对象来包装您想要在发生异常时回滚的所有操作。您还需要确保您的 VB6 组件在 COM+ 服务中运行,并且启用了事务。

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,
        new TransactionOptions(), EnterpriseServicesInteropOption.Full))
{
    dotNetDatabaseOperations(); //call whatever .net code here
    comProxy.comMethod(); //call to your VB6 component with interop wrapper

    scope.Complete();
} //if any exception happens in either .net or COM,
  //entire transaction will be rolled back here

【讨论】:

  • 非常感谢您的回答,我漫长的一天刚刚结束,明天我会尝试并反馈您的进展情况。
  • 祝你好运,请随时在此处添加任何后续问题,我会尽力提供帮助。
  • 如果事务在 VB 或 VBA 中开始,并且没有在 MTS 中​​运行,这可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多