写了一个类cls,其中有Private mOleDbConnection As New OleDb.OleDbConnection
做了一个mOleDbConnection.open动作
然后我想在Finalize()中销毁mOleDbConnection,于是有
Protected Overrides Sub Finalize()
If Not mOleDbConnection Is Nothing Then
mOleDbConnection.Dispose()
End If
MyBase.Finalize()
End Sub
但是我每次执行的类cls=nothing时报错,“System.InvalidOperationException”类型的未经处理的异常在 System.Data.dll 中发生
其他信息: 句柄未初始化。
VB6每次set nothing都会执行 Class_Terminate,而VB.net不会立即执行清理
那么我要怎么才能立即销毁类里面的这个模块级的mOleDbConnection?
------解决思路----------------------
Public NotInheritable Class OleDbConnection _
Inherits DbConnection _
Implements ICloneable, IDbConnection, IDisposable
OleDbConnection本身就继承了IDisposable,不需要显性的销毁,.Net自己会把它干掉的,记得关闭connection就行了。
------解决思路----------------------
在.net中,每当GC回收一个对象,必然会调用其 Dispose() 方法(如果有的话)。而释放你的对象之前,自然会去释放 mOleDbConnection。因此根本不用画蛇添足去调用 Dispose() 方法。
至于说“为什么在程序中需要调用 DbConnection 类型对象的 Dispose()方法?”,这是为了在宿主对象被销毁之前就提前、尽快地释放数据库连接,归还到连接池中,以免出现“连接池满”的异常。
而你的这段程序并没有这种需求,所以你也不需要调用 Dispose() 方法。
------解决思路----------------------
Connection 对象用 Open、Close 来控制外部资源(连接)的占用和释放,这个要显式调用。
至于对象自身的 Dispose,由 .Net 自动完成,你只需要在必要时 Set Nothing 就可以了。
由于 Set Nothing 和 Dispose 之间有延时,如果你调用了 Open 而没有调用 Close,连接在 Dispose 之前是一直开着的。
所以要显式调用 Close。
------解决思路----------------------
你说的不对吧, 在.net中,每当GC回收一个对象,必然会调用其 析构函数(如果有的话), 而Dispose() 方法是手动调用的