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
{
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
你都关了没有呀?
if(_myConn.State==ConnectionState.Open)_myConn.Close();
这句你确认执行了没有?
未发现打开代码,也未发现关闭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;
}
}
}
我不知道执行没有,因为据说析构函数就是用来释放稀有资源的,对吗?
可以参考DataAccess block的设计,
Data Access Application Block,数据访问模块
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/daab-rm.asp
同一个类里面的不同方法也不能使用同一个SqlConnection对象吗?为什么呢?
你提的在petshop里头有些地方要手工关闭conn,而有些地方不需要。
而这两种情况分别是获取DataReader和DataSet/DataView等。
你看一下SqlHelper里头的ExecuteReader的代码,可以看到
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
这里的CommandBehavior.CloseConnection是表示当rdr关闭后,自动关闭数据库conn的链接。
现在应该明白为什么有些地方要手工关闭了吗?
并不是对象生命周期过了就会收回,要取决于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);
}
谢谢提醒 ,看来M$下来的SqlHelper和petshop3.0里面的SqlHelper很多不同了。
to:henryfan1(每天好心情(*_*))
谢谢你的方法, 我会去试试看的。这个重写后的Dispose()需要调用吗?还是CLR自己管理调用?