VB と .NET は異なる SQL 接続を使用するため (また、ADO と ADO.NET で同じ接続を共有する方法はありません)、唯一の可能性は DTC (分散トランザクション コーディネーター) を登録することです。DTC は 2 つの独立したトランザクションを調整して、それらが一緒にコミットまたはロールバックされるようにします。
.NET から、EnterpriseServices は DTC などの COM+ 機能を管理します。.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+ エクスプローラーから行うことができます。コードからもこれを実行できるかどうかは覚えていません。VB6 は COM+ がリリースされる前に作成されたため、COM+ が行うことすべてを完全にサポートしているわけではありません (そのトランザクション サポートは、MS Transaction Server と呼ばれる COM+ の前身向けのものでした)。
すべてが正しく機能する場合、COM+ オブジェクトは、.NET コードによって作成された既存のコンテキストに登録されているはずです。
"Component Services" の "Distributed Transaction Coordinator\Transaction List" ノードを使用して、呼び出し中に作成された分散トランザクションを確認して確認できます。
トランザクションがコミットされるまで、.NET 側からのデータ クエリに反映された COM+ コンポーネントからの変更を確認できないことに注意してください。実際、デッドロックが発生する可能性があります。DTC は 2 つのトランザクションが対になっていることを確認しますが、それらは別個のデータベース トランザクションであることを忘れないでください。