我在function.cs页面里面建立了数据库连接,然后在其他用到数据库的页面把function实例化
但不知道为什么,浏览页面久了,经常会出现连接池满了的现象,是不是我哪里做错了?这是function.cs的部分内容(还有其他函数):....
public function()
{
//
// TODO: 在此处添加构造函数逻辑
Open();//
}// 1.—————————————数据库操作函数——————————————
/*************************************************************
* 类  名:Open()
* 作  用:连接数据库
* 参  数:空
* 返回值:空
***************************************************** */
public void Open()
{   
myConnection=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["sql_Connstr"]);
myConnection.Open();
}/**************************************************************
* 类  名:Close()
* 作  用:关闭数据库和清除DateSet对象
* 参  数:空
* 返回值:空
***************************************************************/
public void Close()
{
if (ds!=null) // 清除DataSet对象
{
ds.Clear();
}
if (myReader!=null)
{
myReader.Close();
}
if (myConnection!=null)
{
myConnection.Close(); // 关闭数据库
}
}
/******************************************************
* 类  名:Fill()
* 作  用:建立DataSet对象,用记录填充或构架(如果必要)DataSet对象,DataSet即是数据在内存的缓存
* 参  数:str_Sql-----打开表Sql语句
* 返回值:空
****************************************************** */
public void Fill(string str_Sql)
{  
Open();
myAdapter = new SqlDataAdapter(str_Sql,myConnection);
ds = new DataSet();
myAdapter.Fill(ds);
}
.....
页面实例化:protected function conn=new function();其中调用function的函数(有树绑定dropdownlist,删除,编辑等函数)时候,刚开始运行没问题,不久就会连接池满了,不知道是哪里出错了,请高手指点,以上面这个为基础,我在其他页面上该如何Close跟Dispose?假使我调用了上面的Fill函数:conn.Fill(sql),后面应该跟上conn.Close(),conn.myConnection.Close(),conn.myConnection.Dispose(),还是怎样?

解决方案 »

  1.   

    每次用完之后马上关闭连接
    还有,这样的工具类,最好是用static的,没有实例化的必要
    去看看sqlhelper另
    不耻下问,在这样的上下文中不太适合^_^
      

  2.   

    我在每页都加上
    private void Page_Unload(object sender, System.EventArgs e)
    {
    conn.Close();
    }还是不行,why?
      

  3.   

    myConnection.Close(); // 关闭数据库
    myConnection.Dispose();conn.Close();放你使用后的立即执行
      

  4.   

    你实例化的时候已经Open()了,Fill的时候又Open
      

  5.   

    那应该怎么做?我很多函数都Open,这样错了吗?/**************************************************
    * 类  名:BindDropDownList()
    * 作  用:绑定DropDownList控件并显示数据,DropDownList控件Value,Text值将等于str_Text值
    * 参  数:str_Text-----绑定DropDownList控件Value,Text值相对应数据库表字段名
    *         sql-----Select-SQL语句
    *         myDropDownList-----DropDownList控件id值
    * 返回值:空
    *************************************************** */
    public void BindDropDownList(string str_Text,string sql,DropDownList myDropDownList)
    {
    // 绑定DropDownList控件(注:四个函数,该函数需要一个字段名,分别绑定Value和Text两值,默认表名)
    Open();
    Fill(sql);
    myDropDownList.DataSource=ds.Tables[0].DefaultView;
    myDropDownList.DataValueField =str_Text;
    myDropDownList.DataTextField=str_Text;
    myDropDownList.DataBind();
    }
      

  6.   

    trycatch finally
          conn.Close()
    end try最好在finally中加入conn.Close()
      

  7.   

    lzt7 ((分头诗人)http://www.lzt7.com)  
    好好学习语文呀!
    不耻下问不是这么用的!
      

  8.   

    哈哈,so sorry,语文差,给大家笑了
      

  9.   

    主要应该是function对象没有得到及时的释放,导致打开的连接过多。
    按你提供的代码看,你好像没有显式的调用Close函数,那么这些数据库连接将一直的保持着,直到你出错。你应该在Fill填充函数中执行 Open 和 Close 函数,而不应该在对象构造时就这么早的连了数据库,这时你还没有用到数据库呢!正如上面大家说的,你应该在需要连接数据库时(如要Fill,或其他操作前)才开始Open,一旦Fill完,或执行完SQL查询,就要Close了,不要等到对象销毁时才关闭数据库连接。
    但是你在对象中使用成员函数来保存数据库连接的话,应该在Function对象销毁时,检查数据库是否已经关闭,如果因为异常情况没有关闭数据库,你需要在最后确保正确关闭数据库连接。
      

  10.   

    不耻下问????问题处在没有及时关闭连接上,每个连接用完后必须手工close(),另外楼主参考下sqlhelper类
      

  11.   

    sorry sorry sorry 哈哈,写问题时候没有留意到语病,只想急切的盼望答复,同时向大家道谢,结贴了,3Q^_^
      

  12.   

    把这个myConnection 定义为static,Open一次其它都可以用了
      

  13.   

    可能是数据库连接没有真正关闭,最好加try,catch块,并且把关闭连接的方法写在finally块里