我正在使用以类似于以下代码的布局编写的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);
}
}
}
}
这对于所有看起来像创建,处理,然后重新制作的功能必须要比保留项目更糟糕。然而,这似乎是我在网上随处可见的设置。
答案 0 :(得分:8)
不,这没有任何问题。完成后,您应该立即处置实施IDisposable
的对象。
给定SqlConnection
,当您处置连接时,底层连接将简单地返回到池中。它可能不像你想象的那样“封闭”。最好让连接池完成它的工作。 Here是MSDN到ADO.NET连接池的链接。试图让它做的事情并非如此(有些人称这种优化,令人惊讶的是)通常是在兔子洞里旅行。
此外,在尝试优化之前,请确保您已实际测量并观察到问题。 (我并不是以严厉的方式表达这一点,只是为了节省您的时间)。