为什么SqlConnection和SqlTransaction都存在于SqlCommand构造函数中?
我想知道是什么原因让这个SqlCommand
构造函数重载:
public SqlCommand(
string cmdText,
SqlConnection connection,
SqlTransaction transaction
)
?
当我需要创建一个内部方法,它使用作为参数提供的事务完成它的位时,我总是发现仅将SqlTransaction
传递给该方法就足够了,因为显然,连接将是tran.Connection
。
这与过载不一样吗? 仅仅通过cmdText
和transaction
是不够的吗?
实际上是否可以针对连接执行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