2010-10-25 75 views
7

我不知道,什么是有这个SqlCommand构造函数重载的原因:为什么SqlConnection和SqlTransaction都存在于SqlCommand构造函数中?

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

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

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

回答

3

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

不过,我会想象这些属性是读/写使能拖N - 下降设计师的支持,其中构造对象使用默认的构造函数和属性设置在InitializeComponent方法中。

相关问题