Предположим, что кто-то (кроме меня) записывает следующий код и компилирует его в сборку:
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
using (var transaction = conn.BeginTransaction())
{
/* Update something in the database */
/* Then call any registered OnUpdate handlers */
InvokeOnUpdate(conn);
transaction.Commit();
}
}
Вызов InvokeOnUpdate (IDbConnection conn) вызывает обработчик событий, который я могу реализовать и зарегистрировать. Таким образом, в этом обработчике у меня будет ссылка на объект IDbConnection, но у меня не будет ссылки на ожидающую транзакцию. Есть ли способ, которым я могу получить сделку? В обработчике OnUpdate я хочу выполнить что-то похожее на следующее:
private void MyOnUpdateHandler(IDbConnection conn)
{
var cmd = conn.CreateCommand();
cmd.CommandText = someSQLString;
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
Однако вызов cmd.ExecuteNonQuery() вызывает исключение InvalidOperationException, в котором говорится, что
"ExecuteNonQuery требует команды иметь транзакцию, когда соединение, назначенное команде, является в ожидающей локальной транзакции. Свойство транзакции команды не был инициализирован".
Могу ли я каким-либо образом заручиться моей командой SqlCommand с ожидающей транзакцией? Могу ли я получить ссылку на ожидающую транзакцию из объекта IDbConnection (я был бы рад использовать отражение при необходимости)?