托管和非托管代码在一个事务中更新数据库?
在C#中,我有一个更新数据库的OracleConnection,以及对C#调用以更新数据库的旧版VB6 DLL的引用(在DLL中,它使用ADODB.Connection对象)。
我需要将它们包装在一个大事务中,以便托管和非托管更新都回滚或提交。
我尝试切换C#类,使其继承System.EnterpriseServices.ServicedComponent并使用[Transaction(TransactionOption.Required)]进行修饰,然后在启动调用序列的方法上使用[AutoComplete],最终命中OracleConnection和VB6 DLL调用。
像这样:
using System.EnterpriseServices;
{
[Transaction(TransactionOption.Required)]
public class MyClassTx: ServicedComponent
{
private MyClass1 _myClass1;
public MyClassTx()
{
}
// This method automatically commits the transaction if it succeeds.
[AutoComplete]
public void DoStuffTransactionally()
{
// Calls into different objects, doing some work that I'd like to have
// a big transaction around.
_MyClass1 = new MyClass1()
_MyClass1.DoSomeStuff();
}
}
}
但是,当我的测试工具尝试实例化MyClassTx时,我收到此错误:
{System.EnterpriseServices.RegistrationException: Invalid ServicedComponent-derived classes were found in the assembly.
(Classes must be public, concrete, have a public default constructor, and meet all other ComVisibility requirements)
我已经验证我的课程是公开的,具体的,并且有一个无参数的构造函数。不过,它不会实例化。
在调试之前,我是否需要强力键入我的程序集并将其放入COM +包中?我原以为,使用VS2010,我可以直接进入ServicedComponent继承代码。
我使用COM +已经有8年了,这是我第一次尝试使用C#,所以任何帮助都会非常感激!
此外,如果我在这里走一条愚蠢的道路并且有更简单的方法将我的托管和非托管代码放入同一个交易中,请赐教!
谷歌的几个小时没有多大帮助。
非常感谢!!
没有找到相关结果
已邀请:
1 个回复
春驹晴陪
所以,我希望有一天这会帮助某人。