代码如下: public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
comData mydata = new comData( "forexds" );
//数据库操作
}
} public class comData
{
public System.Data.OleDb.OleDbConnection myConn;
public static string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}../database/{1}.mdb;User Id=admin;Password=;"; public comData( string dbname )
{
myConn = new System.Data.OleDb.OleDbConnection();
myConn.ConnectionString = string.Format( connstr, System.AppDomain.CurrentDomain.BaseDirectory, dbname );
myConn.Open();
} ~comData()
{
if( myConn != null && myConn.State != ConnectionState.Closed )
myConn.Close(); myConn = null;
}
//其它方法
} } 我的本意是,代码结束后,系统自动调用析构函数~comData(),销毁Page_Load中的mydata,关闭数据库。
可是实际上,我打开页面,然后关闭页面,~comData()一直没有被调用。数据库一直开着,被打开的ACCESS数据库有一个ldb临时文件一直都在。
我现在用的方法就是在Page_Load中手动销毁mydata,关闭数据库,但是觉得不规范,也麻烦,每个页面中都要写。 请高手指点:1. ~comData()为什么没有被调用? 2. 是不是我的总思路有问题?
{
protected void Page_Load(object sender, EventArgs e)
{
comData mydata = new comData( "forexds" );
//数据库操作
}
} public class comData
{
public System.Data.OleDb.OleDbConnection myConn;
public static string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}../database/{1}.mdb;User Id=admin;Password=;"; public comData( string dbname )
{
myConn = new System.Data.OleDb.OleDbConnection();
myConn.ConnectionString = string.Format( connstr, System.AppDomain.CurrentDomain.BaseDirectory, dbname );
myConn.Open();
} ~comData()
{
if( myConn != null && myConn.State != ConnectionState.Closed )
myConn.Close(); myConn = null;
}
//其它方法
} } 我的本意是,代码结束后,系统自动调用析构函数~comData(),销毁Page_Load中的mydata,关闭数据库。
可是实际上,我打开页面,然后关闭页面,~comData()一直没有被调用。数据库一直开着,被打开的ACCESS数据库有一个ldb临时文件一直都在。
我现在用的方法就是在Page_Load中手动销毁mydata,关闭数据库,但是觉得不规范,也麻烦,每个页面中都要写。 请高手指点:1. ~comData()为什么没有被调用? 2. 是不是我的总思路有问题?
using(SqlConnection conn=new SqlConnection())
{
------
}这样就会自动释放Connection的资源
非常感谢,以前也用过USING,就是没想起来,太笨了。
我试一下,行的话马上给分。
B. .NET 中对 connection 的常见用法是 xxxConnection conn = new ...
conn.Open();
xxxCommand cmd = conn.CreateCommand();
// ....
conn.Close();// 用完就关 更加推荐的
using(xxxConnection conn = new ...) {
conn.Open();
xxxCommand cmd = conn.CreateCommand();
// ....
// conn.Close();// 用完就关 // using 展开编译之后内部自动调用 close
}
建议你先看看相关的资料再讨论,如 http://msdn.microsoft.com/zh-cn/library/66x5fx1b(VS.80).aspx至少一点是,C# 中从来不推荐自己实现析构期望并在其中释放相关的资源,如果真的需要,建议考虑 IDispose 接口或者退而用重载 Finalize 方法
1、~comData()为什么没有被调用?
这个不是C++里面的析构函数,它不会被主动调用,它由系统的Finallize线程调用,这个你无法控制。至于原理可以参考一下垃圾回收的文档。 2. 是不是我的总思路有问题?
嗯,链接用完就要关闭,一般我们的写法是:
using(SqlConnection conn ....){
// 数据库操作
}
using语句结束后会自动调用conn的Dispose方法,这个方法会关闭连接。或者你可以显式的在执行完数据库操作以后调用conn.Close方法。