后台就开一个文章列表怎么数据库连接数20多个啊?
我用VS2005+MSSQL2000开发的系统。数据库连接动不动就到2000多了。经常有连接数过多的提示导致网页打不开的。昨天在本机测试了一下。就开一个文章列表页连接数就达到了20多个。我读库的时候开完就关了呀。请高手指点。
我把CS代码粘上来,大家帮我看看哦。
public ado()
{
//
// TODO: 在此处添加构造函数逻辑
//
        connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
}
    /// <summary>
    /// 返回数据库连接字符串
    /// </summary>
    public static SqlConnection con()
    {//数据库连接类
       SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
        return conn;
    }
    /// <summary> 
    /// 关闭当前数据库连接 
    /// </summary> 
    public static void CloseConn()
    {
        if (ado.con().State == ConnectionState.Open)
            ado.con().Close();
        ado.con().Dispose();
        //cmd.Dispose();
    }
    /// <summary>
    /// 根据传进来的SQL语句执行插入/删除/更新等操作
    /// </summary>
    /// <param name="que">查询串</param>
    /// <returns>返回一个布而值,判断操作是否成功</returns>
    public bool insert(string que)
    { //根据传进来的SQL语句执行插入/删除/更新等操作
        SqlConnection conn = ado.con();
        //ado.CloseConn();
        //conn.Open();
        SqlCommand cmd = new SqlCommand(que, conn);
        int count = Convert.ToInt32(cmd.ExecuteNonQuery());
        CloseConn();
        if (count > 0)
            return true;
        else
            return false;
    }
    /// <summary>
    /// 将查询结果放入DataSet中,用于GridView,DataList等的数据绑定.
    /// </summary>
    /// <param name="que">查询串</param>
    /// <returns>返回一个DataTable对像</returns>
    public DataTable ds(string que)
    {//返回一个装载了SQL制定留言的数据表,
        SqlConnection conn = ado.con();
        //ado.CloseConn();
        //conn.Open();
        SqlDataAdapter oda = new SqlDataAdapter();
        oda.SelectCommand = new SqlCommand(que, conn);
        CloseConn();
        DataSet ds = new DataSet();
        oda.Fill(ds);
        return ds.Tables[0];
    }
    public  SqlDataReader dr(string que)
    {//返回一个装载了SQL制定留言的数据表,
        SqlConnection conn = ado.con();
        SqlCommand cmd = new SqlCommand(que, conn);
        CloseConn();
        SqlDataReader dr = cmd.ExecuteReader();
        return dr;
    }
    /// <summary>
    /// 根据传来的条件查询该项是否有内容,有就返回true
    /// </summary>
    /// <param name="que">查询串</param>
    /// <returns>返回一个布而值,判断操作是否成功</returns>
    public bool img(string que)
    {//根据传来的条件查询该项是否有内容,有就返回true
        SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
        if (cmd.ExecuteNonQuery()>0)
            return true;
        else
            return false;
        CloseConn();
    }
    /// <summary>
    /// 同样是根据传来的SQL语句返回一个字段的值
    /// </summary>
    /// <param name="que">查询串</param>
    /// <returns>返回该查询字段的字条串形式</returns>
    public string scr(string que)
    {//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活 
        SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
        return cmd.ExecuteScalar().ToString();
        CloseConn();
    }
    /// <summary> 
    /// 返回指定Sql语句的DataTable 
    /// </summary> 
    /// <param name="sqlstr">传入的Sql语句</param> 
    /// <returns>DataTable</returns> 
    public static DataTable GetDataTable(string sqlstr)
    {
        SqlDataAdapter da = new SqlDataAdapter();
        DataTable datatable = new DataTable();
        try
        {
            ado.con().Open();
            comm.CommandType = CommandType.Text;
            comm.CommandText = sqlstr;
            da.SelectCommand = comm;
            da.Fill(datatable);
            CloseConn();
        }
        catch (Exception)
        {
        }
        finally
        {
            CloseConn();
        }
        CloseConn();
        return datatable;
    }

解决方案 »

  1.   

    调用数据库代码    public void bind()
        {
            //SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
            //string company2 = Request.Form["TextBox1"].Trim();
            //lblMessage.Text = company;
            DateTime startTime = DateTime.Now;
            //string query;
            string sqll, csql, sw, so;
            string aaa, sss;
            aaa = adocc.SafeRequest(TextBox1.Text.Trim());
            sss = adocc.SafeRequest(DropDownList1.SelectedItem.Value.ToString());
            int pagesize = 20;
            int CountRecord;
            page = Convert.ToInt32("0" + Request.QueryString["page"]);        //int pageCount = 1;
            page = page == 0 ? 1 : page;        //page = Convert.ToInt32(0 + cpage);
            csql = "select count(id) from aaa";
            sqll = "select top "+pagesize+" * from aaa where id>0 ";
            so = " order by dtime desc";
           // page = page == 0 ? 1 : page;
            if(aaa!="")
            {
                if (this.DropDownList1.SelectedItem.Value.ToString() == "hy")
                {
                   sw = " and xingming like '%" + aaa + "%'";
                }
                else if (this.DropDownList1.SelectedItem.Value.ToString() == "gs")
                {
                    sw = "and  company like '%" + aaa + "%'";
                }
                else
                {
                    sw = "and  dianhua like '%" + aaa + "%' or freehand like '%" + aaa + "%'";
                }
            }
            else
            {
                //query = "select * from aaa order by dtime desc";
                sw = "";
            }
            
            if (page == 1)
            {
                sqll = sqll + sw + so;
            }
            else
            {
                sqll = sqll + sw + " and id not in(select top " + pagesize * (page - 1) + " id from aaa where id>0 " + sw + so + ")" + so;        }
            CountRecord =Convert.ToInt32( adocc.scr(csql));
            int pagecount = CountRecord % pagesize == 0 ? CountRecord / pagesize : CountRecord / pagesize + 1;
            GridView.DataSource = adocc.ds(sqll);
            //Response.Write(sqll);
            adocc ad = new adocc();
            string[] file={"aaa","sss"};
            string[] val={aaa,sss};
            pagelist.Text = ad.PageList(CountRecord, pagecount,page, file, val);
            //SqlDataAdapter objDataAdapter = new SqlDataAdapter(query, conn);
            //DataSet objDataSet = new DataSet();
            //objDataAdapter.Fill(objDataSet);
            //GridView.DataSource = objDataSet;
            GridView.DataKeyNames = new string[] { "id" };
            GridView.DataBind();
            //conn.Close();
            DateTime endTime = DateTime.Now;
            TimeSpan ts = endTime - startTime;
            this.Label2.Text = "页面执行时间:&nbsp;" + ts.TotalMilliseconds.ToString() + "&nbsp;毫秒";
            GC.Collect();
            adocc.CloseConn();
      

  2.   

     if (ado.con().State == ConnectionState.Open)
    这个写法明显错误的!!首先 你 打开数据库连接  用了 一次 SqlConnection conn = ado.con(),注意这里有一个连接了;
    最后你关数据库的时候ado.con().State == ConnectionState.Open这句话里面 又把 ado.con()调用一遍,而且你这么判断 必然每次都为open,仔细想想!!
    也就是说你关数据库的时候 打开过两次数据库连接,但只关了一次.
    于是就是这样的效果了.
      

  3.   

    你的代码很混乱,搞不清你为什么会设计出这样的逻辑出来
    仔细一看就看出问题了连接没有关闭!!!!并且 构造函数内一直创建了 “垃圾” connection 对象你的 CloseConn() 是错的!!!没有任何效果,你看看, 方法内通过 con() 创建一个新的 connection, 然后马上就关闭了这个新的 connection 并不是你之前正在使用的 connection !!!
    因为 ado.con() 每次返回新的 connnection 对象
      

  4.   

    不用 CloseConn ,用 using 包含你的 代码就回自动释放了using(SqlConnection conn = ado.con()){
    // ...
    }
      

  5.   

     public ado()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
            connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
        }
        /// <summary>
        /// 返回数据库连接字符串
        /// </summary>
        public static SqlConnection con()
        {//数据库连接类
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
            return conn;
        }    ///// <summary> 
        ///// 关闭当前数据库连接 
        ///// </summary> 
        //public static void CloseConn()
        //{
        //    if (ado.con().State == ConnectionState.Open)
        //        ado.con().Close();
        //    ado.con().Dispose();
        //    //cmd.Dispose();
        //}    /// <summary>
        /// 根据传进来的SQL语句执行插入/删除/更新等操作
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回一个布而值,判断操作是否成功</returns>
        public bool insert(string que)
        { //根据传进来的SQL语句执行插入/删除/更新等操作
            using (SqlConnection conn = ado.con())
            {
                //ado.CloseConn();
                conn.Open();
                SqlCommand cmd = new SqlCommand(que, conn);
                int count = Convert.ToInt32(cmd.ExecuteNonQuery());
                //CloseConn();
                if (count > 0)
                    return true;
                else
                    return false;
            }
        }
        /// <summary>
        /// 将查询结果放入DataSet中,用于GridView,DataList等的数据绑定.
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回一个DataTable对像</returns>
        public DataTable ds(string que)
        {//返回一个装载了SQL制定留言的数据表,
            SqlConnection conn = ado.con();
            //ado.CloseConn();
            //conn.Open();
            SqlDataAdapter oda = new SqlDataAdapter();
            oda.SelectCommand = new SqlCommand(que, conn);
            //CloseConn();
            DataSet ds = new DataSet(); 
            oda.Fill(ds); // DataAdapter 自己会 open/close conn
            return ds.Tables[0];
        }
        public SqlDataReader dr(string que)
        {//返回一个装载了SQL制定留言的数据表,
            using (SqlConnection conn = ado.con())
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(que, conn);
                //CloseConn();
                SqlDataReader dr = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); // 当调用方执行 dr.Close 自动 close connection
                return dr;
            }
        }
        /// <summary>
        /// 根据传来的条件查询该项是否有内容,有就返回true
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回一个布而值,判断操作是否成功</returns>
        public bool img(string que)
        {//根据传来的条件查询该项是否有内容,有就返回true
            using (SqlConnection conn = ado.con())
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand(que, conn);
                if (cmd.ExecuteNonQuery() > 0)
                    return true;
                else
                    return false;
            }
            //CloseConn();
        }
      

  6.   

    或者每次crud的时候创建连接,再关闭连接,别把连接 和关闭连接 写成方法了.推荐楼上的,不用多说什么了
      

  7.   

    请每次都关 或者用 DataAdept 自动开关
      

  8.   

    别误人了,dataadapter不是数据库连接的开关另:还是这么多你暂时就别把数据库连接和关闭写成方法了,每次调用的时候new一个连接
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString
    conn.Open();
    ...//你的数据库操作
    conn.Close();熟能生巧,巧能出奇;最基本的多用用,然后再考虑其他的方法.比如上面提到的用using自动释放资源的方法,和封装成函数的方法.
      

  9.   

    先把连接放入变量例如 conn = ado.con().
    然后每次都判断conn,不要去调用ado.con()
    不然每次都是新建一个连接,而且前面的你还不关,当然就越来越多了。
      

  10.   

    修改Con方法能解决,可参考下单件模式.
      

  11.   

    public bool img(string que)
        {//根据传来的条件查询该项是否有内容,有就返回true
            SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
            if (cmd.ExecuteNonQuery()>0)
                return true;
            else
                return false;
            CloseConn();
        }
        /// <summary>
        /// 同样是根据传来的SQL语句返回一个字段的值
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回该查询字段的字条串形式</returns>
        public string scr(string que)
        {//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活 
            SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
            return cmd.ExecuteScalar().ToString();
            CloseConn();
        }这两个函数有明显错误,都return了还能执行return后边的语句吗?
      

  12.   

    你这个类问题很大,调用一个方法后,反复创建多个连接实例,而关闭的时候也没有关掉。你把数据库连接声明在方法外,然后在  public static SqlConnection con()
    方法中创建新实例,其他方法中不要在创建,只要调用就可以了
      

  13.   


    public ado()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
            SqlConnection conn= null;
        }
        /// <summary>
        /// 返回数据库连接字符串
        /// </summary>
        public static SqlConnection con()
        {//数据库连接类
           conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
            return conn;
        }
        /// <summary> 
        /// 关闭当前数据库连接 
        /// </summary> 
        public static void CloseConn()
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
            conn.Dispose();
            //cmd.Dispose();
        }
    /// <summary>
        /// 根据传进来的SQL语句执行插入/删除/更新等操作
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回一个布而值,判断操作是否成功</returns>
        public bool insert(string que)
        { //根据传进来的SQL语句执行插入/删除/更新等操作
              con();
             conn.Open();
            SqlCommand cmd = new SqlCommand(que, conn);
            int count = Convert.ToInt32(cmd.ExecuteNonQuery());
            CloseConn();
            if (count > 0)
                return true;
            else
                return false;
        }
    或者干脆使用using
      

  14.   

    public static void CloseConn()
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();
            conn.Dispose();
            //cmd.Dispose();
        }这个改为:
    public static void CloseConn()
        {
            if (conn.State == ConnectionState.Open)
               {
                  conn.Close();
                 conn.Dispose();
               }
        }
      

  15.   

    哎,建议把LZ的代码作为反面教材以警示后人
    先不说代码逻辑了,就是代码布局和缩进就无语了,还是先看看《.NET设计规范》吧
      

  16.   

    要学会嵌套使用using()这可以了.
      

  17.   

    只保留连接字符串,执行语句用using是最简便的方法。
    或者定义一个Connection变量,执行语句的时候再new,执行完后Close。
      

  18.   

    用sqlhelper吧,这个太麻烦了哦
      

  19.   


    public ado()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
            connection = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
        }
        /// <summary>
        /// 返回数据库连接字符串
        /// </summary>
        public static SqlConnection con()
        {//数据库连接类
           SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["data"].ConnectionString);
            return conn;
        }
        /// <summary> 
        /// 关闭当前数据库连接 
        /// </summary> 
        public static void CloseConn()
        {
            if (ado.con().State == ConnectionState.Open)
                ado.con().Close();
            ado.con().Dispose();
            //cmd.Dispose();
        }
         public  SqlDataReader dr(string que)
        {//返回一个装载了SQL制定留言的数据表,
            SqlConnection conn = ado.con();
            SqlCommand cmd = new SqlCommand(que, conn);
            CloseConn();
            SqlDataReader dr = cmd.ExecuteReader();//上面都Close了 你还能返回DataReader ?糊弄人呢
            return dr;
        }
        /// <summary>
        /// 根据传来的条件查询该项是否有内容,有就返回true
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回一个布而值,判断操作是否成功</returns>
        public bool img(string que)
        {//根据传来的条件查询该项是否有内容,有就返回true
            SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
            if (cmd.ExecuteNonQuery()>0)
                return true;
            else
                return false;
            CloseConn();//上面都return 这根本执行不到 这不是写着骗自己的嘛
        }
        /// <summary>
        /// 同样是根据传来的SQL语句返回一个字段的值
        /// </summary>
        /// <param name="que">查询串</param>
        /// <returns>返回该查询字段的字条串形式</returns>
        public string scr(string que)
        {//同样是根据传来的SQL语句返回一个字段的值,我不太喜欢把SQL语句做在内中,感觉不灵活 
            SqlConnection conn = ado.con();        SqlCommand cmd = new SqlCommand(que, conn);
            return cmd.ExecuteScalar().ToString();
            CloseConn();//上面都return 这根本执行不到 这不是写着骗自己的嘛
        }
        /// <summary> 
        /// 返回指定Sql语句的DataTable 
        /// </summary> 
        /// <param name="sqlstr">传入的Sql语句</param> 
        /// <returns>DataTable</returns> 
        public static DataTable GetDataTable(string sqlstr)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            DataTable datatable = new DataTable();
            try
            {
                ado.con().Open();
                comm.CommandType = CommandType.Text;
                comm.CommandText = sqlstr;
                da.SelectCommand = comm;
                da.Fill(datatable);
                CloseConn();
            }
            catch (Exception)
            {
            }
            finally
            {
                CloseConn();
            }
            CloseConn();//多次一举 上面都关闭了 居然还再次关闭
            return datatable;
        }
      

  20.   

    你的 CloseConn() 是错的!!!没有任何效果,你看看, 方法内通过 con() 创建一个新的 connection, 然后马上就关闭了这个新的 connection 并不是你之前正在使用的 connection !!! 
    因为 ado.con() 每次返回新的 connnection 对象
      

  21.   


    送你一个楼主,你的写的太乱了,看的脑壳痛
    我写的  给你参考下
    呵呵
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data.SqlClient;
    using System.Data;
    using System.Configuration;
    namespace DAL
    {
        public static class DBHelper
        {
            private static string conString = string.Empty;        static DBHelper()
            {
                conString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
            }        /// <summary>
            /// 用于执行只返回一个值的命令
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <param name="cmdType">commandType</param>
            /// <param name="paras">参数</param>
            /// <returns></returns>
            public static object ExecuteScalar(string cmdText, CommandType cmdType, params SqlParameter[] paras)
            {
                object scalar = null;
                using (SqlConnection conneciton = new SqlConnection(conString))
                {
                    SqlCommand cmd = new SqlCommand(cmdText, conneciton);
                    cmd.CommandType = cmdType;
                    cmd.Parameters.AddRange(paras);                cmd.ExecuteScalar();                conneciton.Close();
                }
                return scalar;
            }        /// <summary>
            /// 用于执行增删改命令
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <param name="cmdType">commandType</param>
            /// <param name="paras">参数</param>
            /// <returns></returns>
            public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] paras)
            {
                int num = 0;
                using (SqlConnection connection = new SqlConnection(conString))
                {
                    SqlCommand cmd = new SqlCommand(cmdText, connection);
                    cmd.CommandType = cmdType;
                    cmd.Parameters.AddRange(paras);                num = cmd.ExecuteNonQuery();                connection.Close();
                }
                return num;
            }
            /// <summary>
            /// 用于执行查询命令
            /// </summary>
            /// <param name="cmdText">sql语句</param>
            /// <param name="cmdType">commandType</param>
            /// <param name="paras">参数</param>
            /// <returns></returns>
            public static SqlDataReader ExecuteReader(string cmdText, CommandType cmdType, params SqlParameter[] paras)
            {
                using (SqlConnection connection = new SqlConnection(conString))
                {
                    SqlCommand cmd = new SqlCommand(cmdText, connection);
                    cmd.CommandType = cmdType;
                    cmd.Parameters.AddRange(paras);                return cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
            }
        }
    }
      

  22.   

    /// <summary> 
        /// 关闭当前数据库连接 
        /// </summary> 
        public static void CloseConn()
        {
            if (ado.con().State == ConnectionState.Open)
                ado.con().Close();
            ado.con().Dispose();
            //cmd.Dispose();
        }
    这里的错了
    你把你的conn升级成成员变量就可以了==