2010-10-25 80 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方法中。

相關問題