2011-01-06 37 views
12

Cuando se consulta la base de datos con la misma consulta pero con diferentes parámetros, ¿es mejor:¿Es mejor reutilizar SqlCommand al ejecutar la misma consulta SQL varias veces?

  • lo hacen en un solo usando,
  • o para crear dos consultas separadas?

ejemplo de un solo usando:

using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    // Insert the first product. 
    addProduct.Parameters.AddWithValue("@name", "Product 1"); 
    addProduct.Parameters.AddWithValue("@price", 41F); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 

    addProduct.Parameters.Clear(); 

    // Insert the second product. 
    addProduct.Parameters.AddWithValue("@name", "Product 2"); 
    addProduct.Parameters.AddWithValue("@price", 49.9); 
    countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

ejemplo del mismo código utilizando dos consultas separadas:

// Insert the first product. 
using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    addProduct.Parameters.AddWithValue("@name", "Product 1"); 
    addProduct.Parameters.AddWithValue("@price", 41F); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

// Insert the second product. 
using (SqlCommand addProduct = new SqlCommand(@"insert into [Products].[Products] ([Name], [Price]) values (@name, @price)", sqlConnection)) 
{ 
    addProduct.Parameters.AddWithValue("@name", "Product 2"); 
    addProduct.Parameters.AddWithValue("@price", 49.9); 
    int countAffectedRows = addProduct.ExecuteNonQuery(); 
    Debug.Assert(countAffectedRows == 1, "Wrong number of rows affected."); 
} 

En mi opinión, la segunda debe ser preferible , porque:

  • hace que sea más claro ver dónde está dispuesto el comando SQL y cuántas veces se ejecuta,
  • es más fácil de modificar si, en el futuro, por alguna razón, la consulta debe modificarse en un caso, pero no en el otro,
  • el primero hace que sea fácil olvidar el SqlCommand.Parameters.Clear().

Por otro lado, la primera muestra es más explícita sobre el hecho de que la consulta es la misma en ambos casos, y que solo cambian los parámetros.

+2

Tiene razón, la segunda solución es más limpia. No debe volver a utilizar el mismo SqlCommand a menos que vaya a hacer un ajuste de mega-mega rendimiento. – Davita

+2

Quizás deba colocar el código de inserción en una función separada y llamarlo dos veces. –

Respuesta

15

Hay muy poco beneficio en reutilizar la instancia de comando, a menos que esté planeando llamar al Prepare.

Si va a ejecutar el comando muchas veces (docenas o más), entonces probablemente quiera crear el comando, prepararlo, ejecutarlo en un bucle y luego deshacerse de él. Las ganancias de rendimiento son importantes si ejecuta el comando muchas veces. (Sin embargo, agregaría los parámetros una vez antes de prepararlos, no los eliminará y los volverá a agregar cada vez que lo haga en su primer ejemplo de código. Deberá cambiar los valores de los parámetros cada vez, no crear nuevos parámetros.)

Si solo va a ejecutar el comando unas cuantas veces, el rendimiento no es un problema, y ​​debe elegir el que prefiera. Crear el comando cada vez tiene la ventaja de que es fácil de extraer en un método para que no se repita.

0

Si con "mejor" quiere decir "más claro" o "más limpio", utilice objetos SqlCommand por separado. Esto también ayudará con la refacturación de su código en el futuro.

Si con "mejor" quiere decir "más rápido", reutilizar el SqlCommand eliminará la posibilidad de que se cree una nueva conexión SqlConnection (en lugar de ser extraída del grupo de conexiones).

+1

Ambas llamadas de constructor en su segundo ejemplo usan una conexión ya abierta. – sisve

Cuestiones relacionadas