我自己写了一个类,用来处理各种查询,类的构造函数就是连接数据库,conn是在web.config中写好的连接字符串。
  现在的问题是:网站用了一段时间就会出现数据库连接超时的错误,后来查了查,应该是SqlConnection没有关闭,但是像如下代码应该如何关闭连接呢。我曾经想过把 connStr = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString());
connStr.Open();放到static函数中,然后每次生成类的时候,查询connstr是否为空,如果不为空再连接。但我觉得这样还是不够理想,请各位老师多提宝贵意见,谢谢!代码结构如下,
===================================================
public class sqldata
{
    private SqlConnection connStr;
    public SqlCommand cmd;
    private SqlDataReader dr;    public sqldata()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
        connStr = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString());
        connStr.Open();
    }    public SqlDataReader getUserName(int userID)
    {
        cmd = new SqlCommand("getUserName", connStr);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("@userID", userID);
        dr = cmd.ExecuteReader();
        //connStr.Close();<--这个地方关闭了连接,那返回的dr也没有内容了应该如何正确的关闭连接呢?
        return dr;
    }
   
   //    。等等都是一些返回SqlDataReader的函数选择正确的时间和地点关闭连接?这真是一个困扰我等菜鸟的问题,在线等大家的经验之谈,看我这段代码,或者这个类应该如何重写。

解决方案 »

  1.   

    using (SqlConnection connStr = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["conn"].ToString()))
    {
         connStr.Open();
    }
    不用担心连接会完全回收掉,会放到连接池里缓存一段时间。
      

  2.   

    看看高手写的,跟楼主的有些相似,不过他用了析构函数。
    /// <summary>
        /// 类,用于数据访问的类。
        /// </summary>
        public class Database : IDisposable
        {
            /// <summary>
            /// 保护变量,数据库连接。
            /// </summary>
            protected SqlConnection Connection;        /// <summary>
            /// 保护变量,数据库连接串。
            /// </summary>
            protected String ConnectionString;        /// <summary>
            /// 构造函数。
            /// </summary>
            /// <param name="DatabaseConnectionString">数据库连接串</param>
            public Database()
            {
                ConnectionString = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
                //ConnectionString = ConfigurationManager.ConnectionStrings["PublishDB"].ToString();        }        /// <summary>
            /// 析构函数,释放非托管资源
            /// </summary>
            ~Database()
            {
                try
                {
                    if (Connection != null)
                    {
                        Connection.Close();
                    }
                }
                catch (Exception ex)
                {
                    Logger.Log.Error("数据库链接错误:", ex);
                }
                try
                {
                    Dispose();
                }
                catch { }
            }        /// <summary>
            /// 保护方法,打开数据库连接。
            /// </summary>
            protected void Open()
            {
                if (Connection == null)
                {
                    Connection = new SqlConnection(ConnectionString);
                }
                if (Connection.State.Equals(ConnectionState.Closed))
                {
                    Connection.Open();
                }
            }        /// <summary>
            /// 公有方法,关闭数据库连接。
            /// </summary>
            public void Close()
            {
                if (Connection != null)
                    Connection.Close();
            }        /// <summary>
            /// 公有方法,释放资源。
            /// </summary>
            public void Dispose()
            {
                // 确保连接被关闭
                if (Connection != null)
                {
                    Connection.Dispose();
                    Connection = null;
                }
            }        /// <summary>
            /// 公有方法,获取数据,返回一个SqlDataReader (调用后主意调用SqlDataReader.Close())。
            /// </summary>
            /// <param name="SqlString">Sql语句</param>
            /// <returns>SqlDataReader</returns>
            public SqlDataReader GetDataReader(String SqlString)
            {
                Open();
                SqlCommand cmd = new SqlCommand(SqlString, Connection);
                SqlDataReader dataReader = null;
                try
                {
                    dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    Logger.Log.Error("GetDataReader错误:", ex);
                }
                return dataReader;
            }        /// <summary>
            /// 公有方法,获取数据,返回一个DataSet。
            /// </summary>
            /// <param name="SqlString">Sql语句</param>
            /// <returns>DataSet</returns>
            public DataSet GetDataSet(String SqlString)
            {
                Open();
                DataSet dataset = new DataSet();
                try
                {
                    SqlDataAdapter adapter = new SqlDataAdapter(SqlString, Connection);
                    adapter.Fill(dataset);
                    Close();
                }
                catch (Exception ex)
                {
                    Logger.Log.Error("GetDataSet错误:", ex);
                }
                return dataset;
            }
      

  3.   

    只要注意SQLCONNECTION不要静态,用完之后立刻关闭
      

  4.   

    感觉PetShop4的SQLHeper写的不错,可以看看!
      

  5.   

    对我很有帮助,我准备按这个方法来修改:http://hi.baidu.com/liwei_wang/blog/item/b39a8aa74e7e109cd0435872.html
    使用CommandBehavior.CloseConnection