我的连接没有显示打开,那我还用关闭连接,释放连接资源吗?
比如我的代码实现方式是这样的:
SqlCommandBuilder cmdDept = new SqlCommandBuilder(daDept);
Con = new SqlConnection(SQLHelper.CONN_STRING_NON_DTC);
daDept = new SqlDataAdapter("select id,name,descn from CodeDept",SQLHelper.CONN_STRING_NON_DTC);
dsDept = new DataSet(); daDept.Fill(dsDept);
DataGrid1.DataSource = dsDept;
if(!Page.IsPostBack)
{
AccountInfo myAccount = new AccountInfo();
AccountController ac = new AccountController();
myAccount = ac.GetAccountInfo(true);
DataGrid1.DataBind();
Session["index"] = null;
}
这里的Con没有显示地open(),我还需要用Close()和Dispose()方法释放连接吗?因为我现在出现了
"超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。"这样的错误!谢谢指点!

解决方案 »

  1.   

    如果调用SqlDataAdapter之前con是closed,那么调用Fill之后,con还会是closed,不需要再调用con的close方法,如果调用fill之前,con是opened,那么,调用fill之后,con还会是opened,需要调用close方法。
      

  2.   

    if(Conn.State != ConnectionState.Open) Conn.Close();
      

  3.   

    意思就是最好加上连接的状态判定吗?SqlDataAdapter不是有自动释放连接的机制吗?我还需要显示地去关闭它吗?
      

  4.   

    更改连接池设置,可能有其他地方没有释放连接,而不是这段代码(比如用到了Reader什么的)
      

  5.   

    用try
       {
        }
      catch()
        {
         }
      finally
        {
            Conn.Close();
         }
      

  6.   

    再加点,最好每次操作后都加上
    if(Conn.State != ConnectionState.Open) Conn.Close();
    对你只有好处没有坏处啊!
      

  7.   

    forideal(我心飞翔) 说的不错
    不过对于SqlDataAdapter,不需要干预的。
    对SqlCommand之类的,就需要了。
    mazekui(悠悠春竹) 是不是笔误了,应该是
    if(Conn.State != ConnectionState.Closed) Conn.Close();
      

  8.   

    SqlDataAdapter.Fill方法会自动维护状态不需要人工干预:如果调用Fill之前数据库连接是打开的,那么在Fill使用完后,该连接仍然是打开的。如果调用Fill之前数据库连接是关闭的,那么Fill先打开数据库,然后操作,然后就关闭
      

  9.   

    比如我上边的代码,if(Conn.State != ConnectionState.Closed) Conn.Close()大家觉得最好是加在什么地方?
      

  10.   

    超时的话,可能是你提取的数据量过大导致,可以设置SqlCommand对象的TimeOut属性延长超时时间