5

我实际上有两个问题:

1. 如何查看谁在使用我的 Access 数据库?

  • 例如:有人打开了 Access 数据库并创建了 .ldb 文件,我想查看谁打开了该数据库的列表(可能不止一个人)。

2. 如何查看谁在使用链接表?

  • 例如:我有 10 个不同的 Access 数据库,它们都使用同一个链接表。我想看看谁在使用该链接表。

我什至不知道这是否真的可能,但我真的很感谢你的帮助!

供您参考:主要问题是很多人在同一个网络驱动器中使用相同的 Access,所以当我需要更改它时,我必须将它们全部踢出,但我不知道谁在实际使用它。

4

4 回答 4

7

更新:不是读取和解析 .ldb/.lacdb 文件,更好的方法是使用 Access OLEDB 提供程序的“用户名册”功能,如知识库文章中所述

https://support.microsoft.com/en-us/kb/285822

在另一个 SO 问题中

通过VBA获取laccdb文件的内容


原答案:

不久前我整理了以下内容。它看起来很有希望,但后来我发现计算机在断开连接时不会立即从锁定文件中删除。相反,Jet/ACE 似乎(在内部)将它们标记为不活动:如果 ComputerA 断开连接,然后 ComputerB 连接,ComputerB 将覆盖 ComputerA 在锁定文件中的条目。

尽管如此,它确实提供了一个列表。我在这里发布它以防有人可以提供一些改进建议。

我在后端数据库中创建了两个表:

Table: [CurrentConnections]
computerName  Text(255), Primary Key

Table: [ConnectionLog]
computerName  Text(255), Primary Key
userName      Text(255)

我的后端数据库中的 VBA 模块包含以下代码,用于读取(副本)锁定文件并更新 [CurrentConnections] 表:

Public Sub GetCurrentlyConnectedMachines()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim fso As Object  '' FileSystemObject
    Dim lck As Object  '' ADODB.Stream
    Dim lockFileSpec As String, lockFileExt As String, tempFileSpec As String
    Dim buffer() As Byte

    Set cdb = CurrentDb
    cdb.Execute "DELETE FROM CurrentConnections", dbFailOnError
    Set rst = cdb.OpenRecordset("SELECT computerName FROM CurrentConnections", dbOpenDynaset)

    lockFileSpec = Application.CurrentDb.Name
    If Right(lockFileSpec, 6) = ".accdb" Then
        lockFileExt = ".laccdb"
    Else
        lockFileExt = ".ldb"
    End If
    lockFileSpec = Left(lockFileSpec, InStrRev(lockFileSpec, ".", -1, vbBinaryCompare) - 1) & lockFileExt

    '' ADODB.Stream cannot open the lock file in-place, so copy it to %TEMP%
    Set fso = CreateObject("Scripting.FileSystemObject")  '' New FileSystemObject
    tempFileSpec = fso.GetSpecialFolder(2) & "\" & fso.GetTempName
    fso.CopyFile lockFileSpec, tempFileSpec, True

    Set lck = CreateObject("ADODB.Stream")  '' New ADODB.Stream
    lck.Type = 1  '' adTypeBinary
    lck.Open
    lck.LoadFromFile tempFileSpec
    Do While Not lck.EOS
        buffer = lck.Read(32)
        rst.AddNew
        rst!computerName = DecodeSZ(buffer)
        rst.Update
        buffer = lck.Read(32)  '' skip accessUserId, (almost) always "Admin"
    Loop
    lck.Close
    Set lck = Nothing
    rst.Close
    Set rst = Nothing
    Set cdb = Nothing
    fso.DeleteFile tempFileSpec
    Set fso = Nothing
End Sub

Private Function DecodeSZ(buf() As Byte) As String
    Dim b As Variant, rt As String
    rt = ""
    For Each b In buf
        If b = 0 Then
            Exit For  '' null terminates the string
        End If
        rt = rt & Chr(b)
    Next
    DecodeSZ = rt
End Function

下面前端数据库Main_Menu表单中的代码更新了[ConnectionLog]表

Private Sub Form_Load()
    Dim cdb As DAO.Database, rst As DAO.Recordset
    Dim wshNet As Object  '' WshNetwork

    Set wshNet = CreateObject("Wscript.Network")
    Set cdb = CurrentDb
    Set rst = cdb.OpenRecordset("SELECT * FROM ConnectionLog", dbOpenDynaset)
    rst.FindFirst "ComputerName=""" & wshNet.computerName & """"
    If rst.NoMatch Then
        rst.AddNew
        rst!computerName = wshNet.computerName
    Else
        rst.Edit
    End If
    rst!userName = wshNet.userName
    rst.Update
    Set wshNet = Nothing
End Sub

最后,后端数据库中的以下表格列出了[最好的猜测]当前连接

显示活跃用户

它是一种“连续形式”形式,Record Source

SELECT CurrentConnections.computerName, ConnectionLog.userName 
FROM CurrentConnections LEFT JOIN ConnectionLog 
    ON CurrentConnections.computerName = ConnectionLog.computerName 
ORDER BY ConnectionLog.userName; 

后面的代码很简单

Private Sub Form_Load()
    UpdateFormData
End Sub

Private Sub cmdRefresh_Click()
    UpdateFormData
End Sub

Private Sub UpdateFormData()
    GetCurrentlyConnectedMachines
    Me.Requery
End Sub
于 2013-04-09T23:00:07.487 回答
4

简单的。在记事本(或任何文本编辑器)中打开 .ldb 文件,您可以看到机器名称。

于 2013-04-09T20:26:10.397 回答
4

RE: 如何查看谁在使用我的 Access 数据库?• 例如:有人打开了一个Access 数据库并创建了.ldb 文件,我想查看谁打开了该数据库的列表(可能不止一个人)。


只是在寻找其他东西时发生了这个,我想我可以分享我为此做了什么。请注意,这假定主机(数据库文件所在的计算机)使用文件共享来提供对文件的访问。

您需要在主机上,或者有权连接到该计算机。

单击开始右键单击我的电脑并选择管理

如果您不在主机上,请右键单击“计算机管理”并输入主机名

展开“共享文件夹”并单击“打开文件”右侧是当前打开的文件列表以及每个当前用户的用户名

于 2013-12-19T16:56:47.680 回答
2

我同意戈德的原始回答。我在我的数据库上使用了这段代码,似乎有一种方法可以解决在退出数据库时计算机不会从 CurrentConnections 中取出的方法。

我把它放在我的主菜单表单上,因为它在用户退出之前总是打开的。我在我的表单上使用了 unload 事件来让它工作,而且效果很棒!这是我的代码

ps Ignore SetWarnings 我只是打开了它,所以用户不必点击提示。

Private Sub Form_Unload(Cancel As Integer)
Dim wshNet As Object
Dim deleteSQL As String

Set wshNet = CreateObject("WScript.Network")
        DoCmd.SetWarnings False
        deleteSQL = "DELETE tblCurrentConnections.* " & _
        "FROM tblCurrentConnections WHERE[computerName] = '" & wshNet.computerName & "';"
                DoCmd.RunSQL deleteSQL
        DoCmd.SetWarnings True
End Sub
于 2018-06-21T19:39:41.400 回答