因为 VB 和 .NET 将使用不同的 SQL 连接(并且没有办法让 ADO 和 ADO.NET 共享相同的连接),所以您唯一的可能就是加入 DTC(分布式事务协调器)。DTC 将协调两个独立的事务,以便它们一起提交或回滚。
EnterpriseServices从 .NET管理 COM+ 功能,例如 DTC。在 .NET 2.0 及更高版本中,您可以使用 System.Transactions 命名空间,这会使事情变得更好一些。我认为这样的事情应该有效(未经测试的代码):
void SomeMethod()
{
EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
using (TransactionScope s = new TransactionScope(e))
{
MyComPlusClass o = new MyComPlusClass();
o.SomeTransactionalMethod();
}
}
在这一点上,我对此不够熟悉,无法为您提供更多建议。
在 COM+ 方面,您的对象需要配置为使用(很可能“需要”)分布式事务。您可以在 COM+ Explorer 中执行此操作,方法是转到对象的Properties,选择Transaction选项卡,然后单击“ Required ”。我不记得你是否也可以从代码中做到这一点;VB6 是在 COM+ 发布之前创建的,因此它并不完全支持 COM+ 所做的一切(它的事务支持是针对 COM+ 的前身,称为 MS 事务服务器)。
如果一切正常,您的 COM+ 对象应该在您的 .NET 代码创建的现有上下文中登记。
您可以使用“组件服务”中的“分布式事务协调器\事务列表”节点来检查和查看调用期间正在创建的分布式事务。
请注意,在提交事务之前,您无法看到 COM+ 组件的更改反映在 .NET 端的数据查询上!其实是有可能死锁的!请记住,DTC 将确保两个事务是配对的,但它们仍然是独立的数据库事务。