【问题标题】:Create new SQLCommand's or reuse the same one创建新的 SQLCommand 或重复使用相同的
【发布时间】:2009-10-05 03:45:59
【问题描述】:

我需要使用 ADO.NET 向 SQL 2008 发送一个命令列表,以便一个接一个地执行。我应该为我发送的每个 SQL 创建一个新的 SQLCommand 吗? 还是重用相同的 SQLCommand 并仅更改 CommandText 属性? 谢谢,内斯特

【问题讨论】:

    标签: .net sql-server ado.net


    【解决方案1】:

    SqlCommands 非常轻量级。您每次都可以安全地创建一个新的。

    参数化命令存在复杂性,您需要清除和重置所有参数,此时,创建新命令是干净、易于理解且有效的。

    另外,通常也可以每次都使用一个新的SqlConnection。自动的、内置的连接池是提高效率的“魔法”。

    我用这个:

    public void ExecuteQuery(string query)
    {
        this.ExecuteQuery(query, null);
    }
    
    public void ExecuteQuery(string query, Dictionary<string, object> parameters)
    {
        using (SqlConnection conn = new SqlConnection(this.connectionString))
        {
            conn.Open();
    
            using (SqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = query;
    
                if (parameters != null)
                {
                    foreach (string parameter in parameters.Keys)
                    {
                        cmd.Parameters.AddWithValue(parameter, parameters[parameter]);
                    }
                }
    
                cmd.ExecuteNonQuery();
            }
        }
    }
    

    【讨论】:

    • 否决关闭和重新打开连接的建议。在 TransactionScope 中执行此操作会立即将其提升为 DTC 事务,如果不需要,这会损害性能,并且如果 DTC 配置不正确,可能会引入错误。
    • @Andy:当我说“通常可以”时,为什么要投反对票?大多数人不会遇到您所描述的问题。
    • 这不是“通常可以”。只需在 Internet 上搜索自从引入 TransactionScope 以来人们意外地被 DTC 促销咬伤了多少次。通常的建议是每个事务/工作单元重用一个连接。
    猜你喜欢
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2016-05-07
    • 2018-12-01
    • 2019-06-21
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多