2009-03-22 13 views
33

No estoy muy seguro de si esto es posible o no.Reutilizando SqlCommand?

Actualmente estoy trabajando en un proyecto universitario y tengo una función que utiliza procedimientos almacenados. Me gustaría saber si es posible tomar la misma instancia de SqlCommand y aplicar parámetros actualizados para volver a llamar al procedimiento almacenado dentro de la misma función.

Digamos que tengo algo como esto en mi código:

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
myConn = new SqlConnection(myConStr); 
myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@book_id", bookID); 
myCommand.Parameters.AddWithValue("@user_id", userID); 

try 
{ 
    myConn.Open(); 
    myCommand.ExecuteNonQuery(); 

¿Es posible actualizar MyCommand 's parámetros y llamar al procedimiento almacenado de nuevo?

Respuesta

40

Sí. Deberá asegurarse de llamar a myCommand.Parameters.Clear entre cada llamada para volcar los parámetros, pero no hay nada que le impida reutilizar el objeto. (No uso C# con frecuencia, por lo que puede tener un error o dos en el texto)

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
myConn = new SqlConnection(myConStr); 
myConn.Open(); 

myCommand = new System.Data.SqlClient.SqlCommand("team5UserCurrentBooks3", myConn); 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@book_id", bookID); 
myCommand.Parameters.AddWithValue("@user_id", userID); 
myCommand.ExecuteNonQuery(); 

myCommand.Parameters.Clear(); 
myCommand.CommandText= "NewStoredProcedureName"; 
myCommand.CommandType = CommandType.StoredProcedure; 
myCommand.Parameters.AddWithValue("@foo_id", fooId); 
myCommand.Parameters.AddWithValue("@bar_id", barId); 
mycommand.ExecuteNonQuery(); 

myCommand.Parameters.Clear(); 
myCommand.CommandText = " SELECT * FROM table1 WHERE ID = @TID;" 
myCommand.CommandType = CommandType.Text; 
myCommand.Parameters.AddWithValue("@tid", tId); 
SqlReader rdr; 
rdr = myCommand.ExecuteReader(); 
9

Sí! Definitivamente puedes hacer eso. Puede volver a usar la misma conexión también.

También podría hacer algo como esto:

myConStr = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
using (var cn = new SqlConnection(myConStr)) 
using (var cmd = new SqlCommand("team5UserCurrentBooks3", cn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@book_id", SqlDbType.Int).Value = bookID; 
    cmd.Parameters.Add("@user_id", SqlDbType.Int).Value = userID; 

    cn.Open(); 
    cmd.ExecuteNonQuery(); 
} 

Esto es igual que envolver su conexión en un try/catch para asegurarse de que está cerrado.

+0

lamentablemente Parámetros.Añadir ahora está obsoleto. Pero me gusta su idea sobre el uso de – Dmitris

+10

@Dmitris, Solo la sobrecarga Agregar (cadena, objeto) está obsoleta. Todas las demás sobrecargas de Add están bien de usar; consulte http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.add.aspx para obtener más información. – LukeH

Cuestiones relacionadas