public class DALModel
{
private SqlConnection _myConn;
public DALModel()
{//构造
_myConn = DALFactory.getConn();
_myConn.Open();
} ~DALModel(){//析构,确保Model对象被回收之前关闭打开的数据库连接
if(_myConn.State==ConnectionState.Open)_myConn.Close();
}
}为什么我刷新一个页面多了,就出现这个错误??看图
http://www.ruhof.com.cn/temp/1.gif

解决方案 »

  1.   


    你都关了没有呀?
    if(_myConn.State==ConnectionState.Open)_myConn.Close();
    这句你确认执行了没有?
      

  2.   

    谢谢楼上的,你研究过petShop吗,我发现它里面有一段代码(读取)就没关闭conn而有的地方(更新)就关闭了??PetShop 3.0 的SQLServerDAL.cs类
    未发现打开代码,也未发现关闭conn的代码???—————————————————————
    using (SqlDataReader rdr = SQLHelper.ExecuteReader(SQLHelper.CONN_STRING_NON_DTC, CommandType.Text, SQL_SELECT_ACCOUNT, signOnParms)) {
    if (rdr.Read()) {
    AddressInfo myAddress = new AddressInfo(rdr.GetString(1), rdr.GetString(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7), rdr.GetString(8), rdr.GetString(9));
    return new AccountInfo(userId, password, rdr.GetString(0), myAddress, rdr.GetString(10), rdr.GetString(11), Convert.ToBoolean(rdr.GetInt32(12)), Convert.ToBoolean(rdr.GetInt32(13))); 
    }
    return null;
    }这里却有了打开代码,也有了关闭conn————————————————————
    using (SqlConnection conn = new SqlConnection(SQLHelper.CONN_STRING_NON_DTC)) {
    conn.Open();
    using (SqlTransaction trans = conn.BeginTransaction()) {
    try {
    SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_SIGNON, signOnParms);
    SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_ACCOUNT, accountParms);
    SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_PROFILE, profileParms);
    trans.Commit();

    }catch {
    trans.Rollback();
    throw;
    }
    }
    }
      

  3.   

    to:bomb_boy(梦之星) 
    我不知道执行没有,因为据说析构函数就是用来释放稀有资源的,对吗?
      

  4.   

    DataReader 释放时 会自动关闭连接 而其他需要显式关闭
      

  5.   

    嗯,那我那个图是什么意思呢?连接池用尽吗?用尽的原因是因为没有及时关闭conn吗?
      

  6.   

    不要使用同一个SqlConnection对象,
    可以参考DataAccess block的设计,
    Data Access Application Block,数据访问模块
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp
      

  7.   

    这样释放Conn写在析构函数里面可行吗?
      

  8.   

    tozhzuo(秋枫):不要使用同一个SqlConnection对象
    同一个类里面的不同方法也不能使用同一个SqlConnection对象吗?为什么呢?
      

  9.   

    TO KAI3000(天天向上) :
    你提的在petshop里头有些地方要手工关闭conn,而有些地方不需要。
    而这两种情况分别是获取DataReader和DataSet/DataView等。
    你看一下SqlHelper里头的ExecuteReader的代码,可以看到
    SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
    这里的CommandBehavior.CloseConnection是表示当rdr关闭后,自动关闭数据库conn的链接。
    现在应该明白为什么有些地方要手工关闭了吗?
      

  10.   

    这样是不行的,程序员无法控制何时调用析构函数,因为这由垃圾回收器决定的。
    并不是对象生命周期过了就会收回,要取决于GC内部调用的时间
    最好是实现IDisposable 接口来实现资源释放。
    public void Dispose()
    {
    // TODO:  添加 ExecuteSession.Dispose 实现
    CDispose(true); GC.SuppressFinalize(this); }
    private bool disposed = false;
    private void CDispose(bool disposing)
    {
    if(mConnection != null)
    {
    if(this.mConnection.State != System.Data.ConnectionState.Closed)
    {
    this.mConnection.Close();
    }
    this.mConnection.Dispose();
    this.mConnection =null;
    }
    if(!this.disposed)
    {
    if(disposing)
    {

    component.Dispose();
    }

    }

    disposed = true;         
    }
    ~ExecuteSession()
    {
    CDispose(false);
    }
      

  11.   

    我的ASP.NET出现的现象和你一样,采取的也是自己的一个DAL,也是刷新几次后出现Connection.Open()出现错误,不过再多刷几次又可以了。同样的程序在有些机器上却可以正常运行没有出现错误。
      

  12.   

    to:HONGDUN()
    谢谢提醒 ,看来M$下来的SqlHelper和petshop3.0里面的SqlHelper很多不同了。
    to:henryfan1(每天好心情(*_*)) 
    谢谢你的方法, 我会去试试看的。这个重写后的Dispose()需要调用吗?还是CLR自己管理调用?
      

  13.   

    刚才试了下实现IDisposable接口,还是通不过:(