You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Access VBA检测用户是否打开多个同数据库实例

问题解答

代码重复输出数据库名的原因

你看到的两条相同数据库路径,是Access的固有特性,和多实例无关:
DBEngine.Workspaces(0).Databases集合存储的是当前Access进程内所有打开的数据库对象引用:

  • 你通过界面打开数据库时,会自动向集合中添加第一个对应数据库的对象
  • 只要代码运行过程中(包括Access内部隐式调用)使用过CurrentDb方法,就会生成一个临时Database对象加入集合,所以会出现两条完全相同的路径,两者都属于同一个Access进程,不是你要检测的多开实例。

你可以通过去重逻辑过滤重复条目,修改后的参考代码如下:

Public Sub listCurrentProcessDBs()
    Dim wrkCurrentWorkSpace As Workspace
    Dim i As Integer
    Dim strDatabases As String
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")
    
    Set wrkCurrentWorkSpace = DBEngine.Workspaces(0)

    For i = 0 To wrkCurrentWorkSpace.Databases.Count - 1
        dbPath = wrkCurrentWorkSpace.Databases(i).Name
        If Not dict.Exists(dbPath) Then
            dict.Add dbPath, True
        End If
    Next
    
    strDatabases = Join(dict.keys, vbCrLf)
    MsgBox "当前进程打开的数据库:" & vbCrLf & strDatabases
    
    Set dict = Nothing
    Set wrkCurrentWorkSpace = Nothing
End Sub

现有思路的核心缺陷

你的实现思路本身无法完成跨进程多实例检测:
DBEngine、Workspace、Databases都是Access进程内的COM对象,仅能查询当前Access进程打开的数据库,你额外启动的其他Access进程是完全独立的进程空间,无法通过这个方法探测到,所以永远检测不到其他实例打开的同一个数据库。

可行的多实例检测方案

可以通过解析Access锁文件实现需求:
Access打开.accdb/.mdb格式的数据库时,会在同目录生成对应后缀为.laccdb/.ldb的锁文件,文件中每64字节对应一个打开实例的记录,存储了打开设备和用户的信息,你只需要统计锁文件中的有效记录数,就能得到当前数据库的总打开实例数。
实现逻辑如下:

  • 拼接当前数据库对应的锁文件路径
  • 锁文件不存在说明仅当前1个实例打开
  • 读取锁文件二进制内容,按64字节分段,统计非空分段的数量即可得到实例总数

内容的提问来源于stack exchange,提问作者DrewCraven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:18:00