我有一个业务层,它将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都将被正确处理掉.谢谢.
理想情况下,您的业务层不应该了解数据层的实现细节.因此,无论是使用SqlCommand对象还是使用NHibernate等实现数据层,都应该与业务层无关.这使得理论上讲它很容易"移出"你的数据层并用另一个替换它.
总结:SqlCommand在我看来,从业务层传递到数据层并不是一种好的做法.
关于Dispose():如果使用using语句(如using(SqlConnection ...)),则Dispose()在using语句结束时自动调用该方法.您不必手动执行此操作.