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

2024-04-14

我正在使用一个 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一旦你完成了它们。

Given a SqlConnection,当您释放连接时,底层连接将简单地返回到池中。它不一定像您想象的那样“封闭”。最好让连接池完成它的工作。Here http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx是 MSDN 上 ADO.NET 连接池的链接。试图让它做一些它没有设计目的的事情(令人惊讶的是,有些人称之为优化)通常会陷入兔子洞。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否应该重用 SqlConnection、SqlDataAdapter 和 SqlCommand 对象? 的相关文章

随机推荐