【问题标题】:Is it better to reuse SqlCommand when executing the same SQL query several times?多次执行同一个 SQL 查询时重用 SqlCommand 会更好吗?
【发布时间】:2011-06-05 00:13:59
【问题描述】:

查询同一个查询但参数不同的数据库时,是不是更好:

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

单用示例:

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()

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

【问题讨论】:

  • 你是对的,第二种解决方案更干净。除非您要进行超大型性能调整,否则不应重复使用相同的 SqlCommand。
  • 也许您应该将插入代码放入单独的函数中并调用两次。

标签: c# refactoring readability


【解决方案1】:

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

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

如果您只打算运行该命令几次,则性能不是问题,您应该选择您喜欢的任何风格。每次创建命令的好处是可以很容易地提取到方法中,这样您就不会重复自己。

【讨论】:

    【解决方案2】:

    如果“更好”是指“更清晰”或“更清晰”,请使用单独的 SqlCommand 对象。这也将有助于重构您的代码。

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

    【讨论】:

    • 第二个例子中的两个构造函数调用都使用了一个已经打开的连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多