gpt4 book ai didi

c# - 是否应该重用 SqlConnection、SqlDataAdapter 和 SqlCommand 对象?

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

我正在使用一个 DAL 对象,该对象的布局类似于以下代码。我简化了很多代码代码只是为了显示设置。

public class UserDatabase : IDisposable
{
private SqlDataAdapter UserDbAdapter;
private SqlCommand UserSelectCommand;
private SqlCommand UserInsertCommand;
private SqlCommand UserUpdateCommand;
private SqlCommand UserDeleteCommand;

private System.Data.SqlClient.SqlConnection SQLConnection;

public UserDatabase()
{
this.SQLConnection = new System.Data.SqlClient.SqlConnection(ConnectionString);
this.UserDbAdapter= new SqlDataAdapter();
this.UserDbAdapter.DeleteCommand = this.UserDeleteCommand;
this.UserDbAdapter.InsertCommand = this.UserInsertCommand;
this.UserDbAdapter.SelectCommand = this.UserSelectCommand;
this.UserDbAdapter.UpdateCommand = this.UserUpdateCommand;
}

private bool FillUsers(DataSet UserDataSet, out int numberOfRecords)
{
bool success = true;

numberOfRecords = 0;
string errorMsg = null;

this.UserDbAdapter.SelectCommand = this.GetUsersSelectCommand();

numberOfRecords = UserDbAdapter.Fill(UserDataSet, UsersTableName);

return success;
}

private SqlCommand GetUserSelectCommand()
{
if (this.UserSelectCommand==null)
this.UserSelectCommand= new System.Data.SqlClient.SqlCommand();
this.UserSelectCommand.CommandText = "dbo.Users_Select";
this.UserSelectCommand.CommandType = System.Data.CommandType.StoredProcedure;
this.UserSelectCommand.Connection = this.SQLConnection;
this.UserSelectCommand.Parameters.Clear();
this.UserSelectCommand.Parameters.AddRange(new System.Data.SqlClient.SqlParameter[] {
new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Variant, 0, System.Data.ParameterDirection.ReturnValue, false, ((byte)(0)), ((byte)(0)), "", System.Data.DataRowVersion.Current, null)});

return UserSelectCommand;
}

还有多个其他 Fill 类型函数以相同的方式编写,重用了 Connection 对象、SqlCommands 和 SqlDataAdapter。 SqlDataAdapter 在内部管理 SqlConnection 的打开和关闭。

所以我的问题是多部分的。这个设计不好吗?如果是,为什么?

如果不好,是否应该更改为将内容保留在更局部的范围内,如下所示:

    public bool FillUsers(DataSet UserDataSet)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
using (SqlCommand command = GetUsersSelectCommand())
{
using (SqlDataAdapter adapter = new SqlDataAdapter(command, conn))
{
adapter.Fill(UserDataSet, UsersTableName);
}
}
}
}

所有功能都必须这样做,这似乎是创建、处理然后重新制作比保留项目更糟糕的事情。然而,这似乎是我在网上随处看到的设置。

最佳答案

不,这没有任何问题。您应该在完成处理后立即释放实现了 IDisposable 的对象。

给定一个 SqlConnection,当您释放连接时,底层连接将简单地返回到池中。它不一定像您想象的那样“封闭”。最好让连接池完成它的工作。 Here是 MSDN 上指向 ADO.NET 连接池的链接。试图让它做一些它不是为它设计的事情(令人惊讶的是,有些人称之为优化)通常是在兔子洞里的一次旅行。

另外,在尝试优化问题之前,请确保您已实际测量并观察到问题。 (我的意思不是苛刻,只是为了节省您的时间)。

关于c# - 是否应该重用 SqlConnection、SqlDataAdapter 和 SqlCommand 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11236203/

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