在多次执行相同的SQL查询时重用SqlCommand更好吗?

时间:2011-01-06 23:52:23

标签: c# refactoring readability

使用相同的查询但不同的参数查询数据库时,最好是:

  • 一次性使用,
  • 或创建两个单独的查询?

单人使用示例:

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.");
}

使用两个单独查询的相同代码示例:

// 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.");
}

在我看来,第二个必须首选,因为:

  • 它使得查看SQL命令的位置以及执行的次数变得更加清晰,
  • 如果将来由于某种原因必须在一种情况下修改查询而在另一种情况下不能修改查询,则更容易修改
  • 第一个让人很容易忘记SqlCommand.Parameters.Clear()

另一方面,第一个示例更清楚地表明在两种情况下查询都相同,并且只有参数发生变化。

2 个答案:

答案 0 :(得分:17)

重复使用命令实例几乎没有什么好处,除非您打算拨打Prepare

如果你要多次运行该命令(几十次或更多次),那么你可能想要创建命令,准备它,在循环中执行它,然后处理它。如果您多次运行该命令,性能提升非常重要。 (在准备之前,您可以添加一次参数 - 不要像在第一个代码示例中那样每次删除和重新添加它们。您应该更改每个参数' values 时间,不创建新参数。)

如果你只是在几次运行命令,性能不是问题,你应该选择你喜欢的任何一种风格。每次创建命令都有一个好处,即它很容易被提取到一个方法中,所以你不要重复自己。

答案 1 :(得分:0)

如果“更好”意味着“更清晰”或“更清洁”,请使用单独的SqlCommand对象。这也有助于在未来重构您的代码。

如果“更好”意味着“更快”,则重新使用SqlCommand将消除创建新SqlConnection的可能性(相对于从连接池中提取)。