使用相同的查询但不同的参数查询数据库时,最好是:
单人使用示例:
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.");
}
在我看来,第二个必须首选,因为:
SqlCommand.Parameters.Clear()
。另一方面,第一个示例更清楚地表明在两种情况下查询都相同,并且只有参数发生变化。
答案 0 :(得分:17)
重复使用命令实例几乎没有什么好处,除非您打算拨打Prepare。
如果你要多次运行该命令(几十次或更多次),那么你可能想要创建命令,准备它,在循环中执行它,然后处理它。如果您多次运行该命令,性能提升非常重要。 (在准备之前,您可以添加一次参数 - 不要像在第一个代码示例中那样每次删除和重新添加它们。您应该更改每个参数' values 时间,不创建新参数。)
如果你只是在几次运行命令,性能不是问题,你应该选择你喜欢的任何一种风格。每次创建命令都有一个好处,即它很容易被提取到一个方法中,所以你不要重复自己。
答案 1 :(得分:0)
如果“更好”意味着“更清晰”或“更清洁”,请使用单独的SqlCommand对象。这也有助于在未来重构您的代码。
如果“更好”意味着“更快”,则重新使用SqlCommand将消除创建新SqlConnection的可能性(相对于从连接池中提取)。