2010-10-25 6 views
7

Me pregunto, ¿cuál es la razón para tener esta sobrecarga SqlCommand constructor:¿Por qué ambos SqlConnection y SqlTransaction están presentes en el constructor SqlCommand?

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

?

Cuando necesito crear un método interno que hace su bit utilizando una transacción proporcionada como argumento, siempre me parece suficiente pasar un SqlTransaction a ese método, porque, obviamente, la conexión será tran.Connection.
¿No se aplica lo mismo a esta sobrecarga? ¿No sería suficiente pasar solo cmdText y transaction?

¿Es realmente posible para ejecutar una SqlCommand contra una conexión, proporcionando una SqlTransaction abrió contra un diferenteSqlConnection? ¿Qué resultará?

Respuesta

3

Esta es una observación interesante porque no puede usar una transacción desde una conexión diferente. El System.Data.SqlClient.SqlCommand (4.0) tiene un miembro de privada llamada ValidateCommand que contiene varias comprobaciones de validación, incluyendo éste:

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

El diseño general de la clase SqlCommand es para la flexibilidad. Las propiedades CommandText, Connection y Transaction (que también están expuestas en las tres sobrecargas de constructor adicionales) son de lectura/escritura. Esto hace que la clase sea flexible, pero también propensa a un uso incorrecto.

Sin duda, las cosas serían mucho más limpias si las propiedades fueran de solo lectura y los constructores se utilizaran como medio principal para pasar datos al objeto. En cuyo caso el siguiente constructor tendría mucho más sentido:

public SqlCommand(string commandText, SqlTransaction transaction) 

Sin embargo, me imagino que estas propiedades son de lectura/escritura para habilitar el soporte diseñador de arrastrar y soltar, donde se construye el objeto utilizando el constructor por defecto y las propiedades se establecen en el método InitializeComponent.

Cuestiones relacionadas