Ух ты, я сначала не поверил. Я удивлен, что CreateCommand()
не дает команду, что это транзакция при использовании локальных транзакций SQL Server, и что транзакция не отображается в объекте SqlConnection
. На самом деле при отражении SqlConnection
текущая транзакция даже не сохраняется в этом объекте. В редактируемой ниже я дал вам несколько советов, чтобы отследить объект через некоторые из их внутренних классов.
Я знаю, что вы не можете изменить метод, но не могли бы вы использовать TransactionScope вокруг панели методов? Так что если у вас есть:
public static void CallingFooBar()
{
using (var ts=new TransactionScope())
{
var foo=new Foo();
foo.Bar();
ts.Complete();
}
}
Это будет работать, я тестировал, используя код, подобный вашему, и как только я добавляю оболочку, все работает нормально, если вы, конечно, можете сделать это. Как указывалось выше, следите за тем, чтобы в TransactionScope
было открыто более одного соединения, и вы перейдете к распределенной транзакции, которая, если ваша система не настроена для них, приведет к ошибке.
Регистрация с помощью кода DTC также в несколько раз медленнее, чем локальной транзакции.
Редактировать
Если вы действительно хотите попробовать и использовать рефлексию, у SqlConnection есть SqlInternalConnection, который в свою очередь имеет свойство AvailableInternalTransaction, которое возвращает SqlInternalTransaction, у него есть свойство Parent, которое возвращает необходимую вам SqlTransaction.