Поскольку VB и .NET будут использовать разные соединения SQL (и нельзя сделать так, чтобы ADO и ADO.NET использовали одно и то же соединение), ваша единственная возможность - подключить DTC (координатор распределенных транзакций). Код неисправности будет координировать две независимые транзакции, чтобы они фиксировали или откатывались вместе.
Из .NET EnterpriseServices управляет функциями 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, зайдя в Свойства вашего объекта , выбрав вкладку Транзакция и нажав " Обязательно ". Я не помню, можете ли вы сделать это из кода; VB6 был создан до выхода COM +, поэтому он не полностью поддерживает все, что делает COM + (его поддержка транзакций предназначалась для предшественника COM +, называемого MS Transaction Server).
Если все работает правильно, ваш объект COM + должен быть задействован в существующем контексте, созданном вашим кодом .NET.
Вы можете использовать узел «Координатор распределенных транзакций \ Список транзакций» в «Службах компонентов», чтобы проверить и увидеть, как создается распределенная транзакция во время вызова.
Имейте в виду, что вы не сможете увидеть изменения компонента COM +, отраженные в запросах данных со стороны .NET, пока транзакция не будет зафиксирована! На самом деле, это возможно в тупик! Помните, что DTC обеспечит сопряжение двух транзакций, но они по-прежнему будут отдельными транзакциями базы данных.