gpt4 book ai didi

c# - 可以将 SQLCommand 作为参数传递吗?

转载 作者:太空狗 更新时间:2023-10-29 19:40:10 25 4
gpt4 key购买 nike

我有一个业务层,它像这样将一个 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);
}

然后 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;
}

像这样将 SQLCommand 作为参数传递对我来说是否可以,或者是否有更好、更容易接受的方法来传递它。我担心的一个问题是,如果在执行查询时发生错误,则 cmd.dispose 行将永远不会执行。这是否意味着它将继续用完永远不会释放的内存?

更新:

听从 Eric 的建议,我更明确地划分了业务层和数据层,因此业务层中的方法如下所示

    public void PopulateLocalData()
{
DataLayer Data = new DataLayer(this.ConnString);
Data.UpdateLocalData();
}

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

通过这种方式,很明显 SQLCommand 和 SQLConnection 都将被正确处理。谢谢。

最佳答案

理想情况下,您的业务层不应该知道数据层的实现细节。因此,无论您是使用 SqlCommand 对象还是使用 NHibernate 之类的对象来实现数据层,都应该与业务层无关。从理论上讲,这使得“移出”数据层并将其替换为另一个数据层变得容易。

总结:将 SqlCommand 从业务层传递到数据层在我看来不是好的做法。

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

关于c# - 可以将 SQLCommand 作为参数传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com