代码如下:    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. 是不是我的总思路有问题? 

解决方案 »

  1.   

    释放资源的时候调用可以这样使用 
    using(SqlConnection conn=new SqlConnection())
    {
    ------
    }这样就会自动释放Connection的资源
      

  2.   


    非常感谢,以前也用过USING,就是没想起来,太笨了。
    我试一下,行的话马上给分。
      

  3.   

    2. 是不是我的总思路有问题?========先看这个。可以说你的思路确实有问题。 A. 对于数据库连接这种“宝贵资源”,你应该用完一次就关闭,不要等着“别人(比如你这里的 ~ctor) ”来帮你关闭
     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
         }
      

  4.   

    1. ~comData()为什么没有被调用?====关于.NET中,特别是C#, 的析构函数,是一个比较庞大的主题,涉及比较的资源管理、释放策略以及最佳实践。
    建议你先看看相关的资料再讨论,如 http://msdn.microsoft.com/zh-cn/library/66x5fx1b(VS.80).aspx至少一点是,C# 中从来不推荐自己实现析构期望并在其中释放相关的资源,如果真的需要,建议考虑 IDispose 接口或者退而用重载 Finalize 方法
      

  5.   


    1、~comData()为什么没有被调用?
    这个不是C++里面的析构函数,它不会被主动调用,它由系统的Finallize线程调用,这个你无法控制。至于原理可以参考一下垃圾回收的文档。 2. 是不是我的总思路有问题?
     嗯,链接用完就要关闭,一般我们的写法是:
     using(SqlConnection conn ....){
         // 数据库操作
         
     }
     
     using语句结束后会自动调用conn的Dispose方法,这个方法会关闭连接。或者你可以显式的在执行完数据库操作以后调用conn.Close方法。