2010-10-25 16 views
7

Mi chiedo, qual è la ragione di avere questo sovraccarico SqlCommand costruttore:Perché sia ​​SqlConnection sia SqlTransaction sono presenti nel costruttore SqlCommand?

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

?

Quando ho bisogno di creare un metodo interno che faccia il suo bit utilizzando una transazione fornita come argomento, trovo sempre sufficiente passare solo un SqlTransaction a quel metodo, perché, ovviamente, la connessione sarà tran.Connection.
Non vale lo stesso per questo sovraccarico? Non sarebbe sufficiente passare solo cmdText e transaction?

E 'effettivamente possibile eseguire un SqlCommand contro una connessione, fornendo un SqlTransaction aperto contro una diversaSqlConnection? In cosa consisterà?

risposta

3

Questa è un'osservazione interessante perché non è possibile utilizzare una transazione da una connessione diversa. Lo System.Data.SqlClient.SqlCommand (4.0) ha un membro privato chiamato ValidateCommand che contiene diversi controlli di convalida, compreso questo:

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

Il disegno complessivo della classe SqlCommand è per la flessibilità. Le proprietà CommandText, Connection e Transaction (che sono anche esposte nei tre overload aggiuntivi del costruttore) sono read/write. Questo rende la classe flessibile, ma anche incline a un uso non corretto.

Certamente, le cose sarebbero molto più pulite se le proprietà fossero di sola lettura e che i costruttori fossero usati come mezzo principale per trasmettere i dati nell'oggetto. Nel qual caso il seguente costruttore avrebbe molto più senso:

public SqlCommand(string commandText, SqlTransaction transaction) 

Tuttavia, vorrei immaginare che queste proprietà sono di lettura/scrittura per abilitare il supporto di design drag-n-drop in cui l'oggetto viene costruito utilizzando il costruttore di default e le proprietà sono impostate nel metodo InitializeComponent.

Problemi correlati