为什么SqlCommand构造函数中同时存在SqlConnection和SqlTransaction?

9

我想知道,为什么会有这个SqlCommand构造函数的重载:

public SqlCommand(
    string cmdText,
    SqlConnection connection,
    SqlTransaction transaction
)

当我需要创建一个内部方法并用作参数传递事务时,我通常只需将SqlTransaction传递到该方法中,因为显然连接将是tran.Connection
同样的方式是否适用于这种重载?仅传递cmdTexttransaction是否足够?

是否真正存在一种可以对连接执行SqlCommand的情况,并提供已针对不同SqlConnection打开的SqlTransaction?此操作会导致什么结果?

1个回答

4

这是一个有趣的观察,因为您无法使用来自不同连接的事务。 System.Data.SqlClient.SqlCommand(4.0)具有名为ValidateCommand的私有成员,其中包含若干验证检查,包括此检查:

if ((this._transaction != null) && (this._activeConnection != this._transaction.Connection))
{
    throw ADP.TransactionConnectionMismatch();
}

SqlCommand类的整体设计是为了灵活性。CommandText、Connection和Transaction属性(也在三个额外的构造函数重载中公开)都是可读写的。这使得该类具有灵活性,但也容易出现使用不当的情况。
当然,如果这些属性是只读的,并且构造函数作为将数据传递到对象的主要方式,则情况会更加清晰。在这种情况下,以下构造函数将更有意义:
public SqlCommand(string commandText, SqlTransaction transaction)

然而,我想这些属性是可读/可写的,以便启用拖放设计器支持,在该对象使用默认构造函数构建并在InitializeComponent方法中设置属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接