Транзакция не установлена

По какой-то причине SqlCommand.Transaction не устанавливается. Код, который его устанавливает, определенно вызывается (проверено в отладчике), но после того, как свойство установлено, свойство по-прежнему null,

Вот код...

cmd.Connection = cmd.Connection ?? Connection;
cmd.Transaction = cmd.Transaction ?? Transaction;
if (cmd.Transaction == null && Transaction != null)
{
    var t = Transaction;
    cmd.Transaction = t;
}

Определение транзакции...

private SqlTransaction Transaction { get; set; }

Я добавил оператор if в случае, если проблема заключалась в операторе объединения (??), но, похоже, это не помогло (не ожидал этого, но теперь цепляется за соломинку).

Я посмотрел на код C# для SqlCommand.Transaction и есть путь, где поле не будет установлено, но в этом сценарии выдается исключение, не говоря уже о том, что условие не должно выполняться в любом случае ( исходный код SqlCommand.cs).

Мы ценим любые предложения.

1 ответ

Решение

Я определил, что SqlTransaction.Connection имеет значение null.

Это проблема. Вы можете устанавливать cmd.Transaction свойство в порядке, но когда вы читаете его обратно, SqlCommand проверим cmd.Transaction.Connection свойство, и если оно равно нулю, оно устанавливает cmd.Transaction вернуться к нулю. Из-за этого может показаться, что вы никогда не устанавливали его с самого начала. Обратите внимание, что это не вызывает исключения в этом сценарии. Вот соответствующий исходный код.

new public SqlTransaction Transaction
{
    get 
    { 
        if ((null != _transaction) && (null == _transaction.Connection))
        { 
            _transaction = null;
        } 
        return _transaction;
    } 
    /* snip */
}
Другие вопросы по тегам