假如有人(除了我之外)写入下面的代码并将其编译成一个程序集:我可以从SqlConnection对象获得对待定事务的引用吗?
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)调用叫一声,我可以实现并注册一个事件处理程序。因此,在这个处理程序中,我将引用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 cmd与挂起的事务吗?我可以从IDbConnection对象中检索对挂起事务的引用(如果需要,我会很乐意使用反射)?
我可能会误解,但在我看来,您的建议要求我可以使用我正在使用的第三方库实例化MyConnection而不是普通的SqlConnection。不幸的是,我没有源代码,它不支持任何形状或形式的依赖注入。 – Rune 2010-12-20 16:03:48
不确定你的意思。在你的情况下,你的“MyConnection”类将采用SqlConnection,OleConnection或你有什么作为参数。不需要注射。看看“委托设计模式”如何工作,如下所示:http://en.wikipedia.org/wiki/Delegation_pattern – Denis 2010-12-20 17:03:52
我明白你的意思了。你的情况很难,因为你让第三个创建你的连接,在我的情况下,我创建了很多连接,但它们在我的应用程序中是全局的,所以我经常失去跟踪谁在打开什么事务,并且希望保持与我的连接。在你的情况下,我猜想在你的第三方创建的连接被传递到MyConnection后,事务将被跟踪。在得到conn之前,你必须弄清楚第三方是否创建了一个交易,所以你别无选择,只能用反射来找到最初的交易。 – Denis 2010-12-20 21:08:25