Access如何释放ODBC

Posted

技术标签:

【中文标题】Access如何释放ODBC【英文标题】:How let Access release the ODBC 【发布时间】:2018-11-13 12:06:58 【问题描述】:

我有 2 个访问数据库,一个用作 CRM,另一个仅使用 ODBC 保存与 firebird 数据库的链接表。这个 firebird 数据库 (fdb) 只允许一个用户访问。

CRM 通过 ODBC 更新表时,没有释放 ODBC 连接(Firebird),这意味着其他需要访问的应用程序无法打开数据库。只有在关闭 CRM 时才会释放 ODBC 连接。

Dim dba as database
Dim strODBCname as string
strODBCname = "OSF_ODBC.accdb"
Set dbs = OpenDatabase(ValidatePath(CurrentProject.Path, False) & strODBCname)
dbs.execute .... (etc.)

在所有记录 R/W 完成后

set dbs = nothing

还有其他方法可以强制释放 ODBC 连接吗?

彼得

【问题讨论】:

【参考方案1】:

我目前不知道如何显式释放当前会话的 ODBC 连接,但您可以在第二个 Access 应用程序会话(内存中的第二个 MsAccess.exe)中打开数据库并在工作后释放它:

Const ODBC_NAME As String = "OSF_ODBC.accdb"

With CreateObject("Access.Application")
    .OpenCurrentDatabase ValidatePath(CurrentProject.Path, False) & ODBC_NAME
    .CurrentDb.Execute ...
    .CurrentDb.Close
    .Quit
End With

这应该肯定会释放连接。

【讨论】:

【参考方案2】:

我不知道您使用的是哪个版本的 Access。但是在你创建一个新的应用对象之前,你应该尝试一下

Set wrkAcc = CreateWorkspace("", "admin", "", dbUseJet) 
Set dbs = wrkAcc.OpenDatabase(ValidatePath(CurrentProject.Path, False) & strODBCname)

或更高一级:

dim dbe=dao.dbengine
set dbe=CreateObject("dao.dbengine")
Set dbs= dbe.OpenDatabase(ValidatePath(CurrentProject.Path, False) & strODBCname)

更全局地,您可以修改控制 ODBC 连接缓存的注册表设置。

【讨论】:

以上是关于Access如何释放ODBC的主要内容,如果未能解决你的问题,请参考以下文章

EXC_BAD_ACCESS 两次释放的对象是啥?

释放对象导致 exc_bad_access

为啥在构造函数中释放会导致 EXC_BAD_ACCESS?

释放thread1 exc_bad_access

EXC_BAD_ACCESS 为啥我的对象被释放?

ACCESS 中的类