2011-01-06 82 views
12

当具有相同的查询,但不同的参数查询数据库,是它更好地:多次执行相同的SQL查询时重用SqlCommand会更好吗?

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

实施例:

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

你说得对,第二个解决方案更干净。除非您打算进行超级性能调优,否则不应该重复使用相同的SqlCommand。 – Davita 2011-01-06 23:56:40

+2

也许你应该把插入代码放到一个单独的函数中并调用它两次。 – 2011-01-07 00:00:19

回答

15

有很少的好处重用的命令情况下,除非你打算叫Prepare

如果你要运行命令多次(几十个或更多),那么你可能要创建的命令,准备它,在一个循环中执行它,然后它丢弃。如果您多次运行该命令,性能提升非常显着。 (但是,在准备之前,您可以添加一次参数 - 不是每次像在第一个代码示例中那样删除并重新添加它们,您应该每次更改参数,而不是创建新的参数。)

如果你只打算运行命令的时间屈指可数,性能是不是一个问题,你应该用你喜欢的任何风格去。每次创建命令都有一个好处,它很容易被提取到一个方法中,所以你不会重复自己。

0

如果“更好”你的意思是“更清晰”或“清洁剂”,使用单独的SqlCommand对象。这也有助于重构代码。

如果“更好”你的意思是“更快”,重新使用的SqlCommand将消除一个新的SqlConnection将创建(相对于从连接池中被拉出)的机会。