代码之家  ›  专栏  ›  技术社区  ›  John Henckel

使用SqlConnection和SqlCommand时顺序重要吗

  •  0
  • John Henckel  · 技术社区  · 7 年前

    我见过很多这样的代码

    using (SqlConnection con = new SqlConnection(connectionString))
    using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
    {
        con.Open();
        // and so on...
    }
    

    我正在重构,如果能先创建命令就太好了。像这样倒车有问题吗?

    using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1"))     
    using (command.Connection = new SqlConnection(connectionString))
    {        
        command.Connection.Open();
        // and so on...
    }
    

    编辑:

    评论中有几个人想知道我为什么要这么做。我同意在多个线程中重用命令是不好的。我倒过来的理由是 重构代码 服务中的重复代码。为了减少这一点,我将尽可能多地进入一个CommonService类。

    public class AuditService
    {
        private readonly CommonService _database;
    
        public DataTable FindAll()
        {
            using (var cmd = new SqlCommand("SELECT * FROM Audit"))
            {
                return _database.FindAll(cmd);
            }
        }
    }
    

    以及 CommonService

    public DataTable FindAll(SqlCommand cmd)
    {
        using (cmd.Connection = new SqlConnection(connectionString))
        {
            var dataSet = new DataSet();
            var adapter = new SqlDataAdapter(cmd);
            adapter.Fill(dataSet);
            return dataSet.Tables[0];
        }
    }    
    

    这对我来说似乎非常清楚,而且更容易进行单元测试。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Onaefe    7 年前

    然后可以继续将sqlCon设置为SqlCommand对象的属性。 i、 e.cmd.Connection=sqlCon;

    试一下,看看他们是怎么工作的。 但是我建议您遵循最佳实践(可能是对维护您的代码的人来说),总是在SqlConnection之前声明和初始化您的SqlConnection。