为什么SqlConnection和SqlTransaction都存在于SqlCommand构造函数中?

我想知道是什么原因让这个SqlCommand构造函数重载:

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

当我需要创建一个内部方法,它使用作为参数提供的事务完成它的位时,我总是发现仅将SqlTransaction传递给该方法就足够了,因为显然,连接将是tran.Connection
这与过载不一样吗? 仅仅通过cmdTexttransaction是不够的吗?

实际上是否可以针对连接执行SqlCommand ,并提供针对不同的SqlConnection打开的SqlTransaction ? 这会导致什么结果?


这是一个有趣的观察,因为您不能使用来自不同连接的事务。 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)

但是,我会想象这些属性是读/写以启用drag-n-drop设计器支持,其中使用默认构造函数构造对象,并在InitializeComponent方法中设置属性。

链接地址: http://www.djcxy.com/p/3449.html

上一篇: Why both SqlConnection and SqlTransaction are present in SqlCommand constructor?

下一篇: Differentiating between uninstalling/installing and upgrading an application