将SQLCommand作为参数传递是否可以?

eto*_*bot 8 c# sql

我有一个业务层,它将Conn字符串和SQLCommand传递给数据层,就像这样

    public void PopulateLocalData()
    {
       System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
       cmd.CommandType = System.Data.CommandType.StoredProcedure;
       cmd.CommandText = "usp_PopulateServiceSurveyLocal";
       DataLayer.DataProvider.ExecSQL(ConnString, cmd);
    }
Run Code Online (Sandbox Code Playgroud)

然后DataLayer就像这样执行sql

        public static int ExecSQL(string sqlConnString, System.Data.SqlClient.SqlCommand cmd)
    { 
        int rowsAffected;
        using (SqlConnection conn = new SqlConnection(sqlConnString))
        {
            conn.Open();
            cmd.Connection = conn;
            rowsAffected = cmd.ExecuteNonQuery();
            cmd.Dispose();
        }
        return rowsAffected;
    }
Run Code Online (Sandbox Code Playgroud)

我可以将SQLCommand作为这样的参数传递,还是有更好的接受方式.我担心的一个问题是,如果在执行查询时发生错误,cmd.dispose行将永远不会执行.这是否意味着它会继续耗尽永远不会释放的内存?

更新:

根据Eric的建议,我更明确地划分了业务层和数据层,因此业务层中的方法看起来像这样

    public void PopulateLocalData()
    {
        DataLayer Data = new DataLayer(this.ConnString);
        Data.UpdateLocalData();
    }
Run Code Online (Sandbox Code Playgroud)

和DataLayer中调用的方法如下所示.

        public void UpdateLocalData()
    {
        using (SqlConnection conn = new SqlConnection(this.ConnString))
        using(SqlCommand cmd = new SqlCommand())
        {
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.CommandText = "usp_PopulateServiceSurveyLocal";
            conn.Open();
            cmd.Connection = conn;
            cmd.ExecuteNonQuery();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样很明显SQLCommand和SQLConnection都将被正确处理掉.谢谢.

Eri*_*oom 6

理想情况下,您的业务层不应该了解数据层的实现细节.因此,无论是使用SqlCommand对象还是使用NHibernate等实现数据层,都应该与业务层无关.这使得理论上讲它很容易"移出"你的数据层并用另一个替换它.

总结:SqlCommand在我看来,从业务层传递到数据层并不是一种好的做法.

关于Dispose():如果使用using语句(如using(SqlConnection ...)),则Dispose()在using语句结束时自动调用该方法.您不必手动执行此操作.