关闭 Access Jet OledbConnection 的最佳方式

Posted

技术标签:

【中文标题】关闭 Access Jet OledbConnection 的最佳方式【英文标题】:Best way to close Access Jet OledbConnection 【发布时间】:2011-12-15 11:00:43 【问题描述】:

在我的 winform 应用程序 - framework 3.5 sp1 - 我有一个自定义数据阅读器。我必须选择关闭连接的方式

第一种方式:

Private cn As OleDb.OleDbConnection = Nothing

Public Sub Open()
    cn = New OleDb.OleDbConnection(sConnectionString)
    cn.Open()

    ' ...

End Sub

Public Sub Close()

    ' ...

    cn.Close()
    cn.Dispose()
End Sub

第二种方式:

Public Sub Open()
    Dim cn As New OleDb.OleDbConnection(sConnectionString)
    cn.Open()

    ' ...

End Sub

Public Sub Close()

    ' ...

End Sub

第二种方式是关闭连接的垃圾收集器。什么是更好的? 谢谢! 皮莱吉

【问题讨论】:

【参考方案1】:

最好是使用using块,一旦你移出块,它就会处理对象。

绝不能等待让 GC 关闭数据库连接。我们永远无法预测 GC 收集对象的执行时间。

【讨论】:

关于使用 Using 块的要点。即使遇到异常,它也允许关闭连接。 +1【参考方案2】:

一般来说,您应该关闭自己打开的每个连接。垃圾收集不会给你任何关于它何时发生的保证。您可能会产生泄漏并阻止未来的查询执行。

来自MSDN:

当满足以下条件之一时,就会发生垃圾收集 真的:

系统物理内存不足。

托管堆上分配的对象使用的内存 超过可接受的阈值。这意味着阈值 托管堆上已超出可接受的内存使用量。这 随着进程的运行,阈值会不断调整。

GC.Collect 方法被调用。在几乎所有情况下,您都没有 调用此方法,因为垃圾收集器不断运行。 此方法主要用于特殊情况和测试。

如果你调用 cn.close,你应该使用 try catch finally 块来确保即使出现异常连接也总是关闭。

【讨论】:

以上是关于关闭 Access Jet OledbConnection 的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Access/jet 相当于 Oracle 的解码

从 .NET 向 Access (Jet) 表添加列

MS Access Jet 数据库以编程方式紧凑

Jet(Access) DB 和基于表达式的列?

MS Access/JET“不支持加入表达式”有啥方法可以修复这个查询吗?

64位Winows2008下连接Access数据库 Jet4.0不支持解决代替方案