我实际上有两个问题:
我甚至不知道它是否真的有可能,但我非常感谢你的帮助!
为了您的信息:主要的问题是很多人在同一个网络驱动器中使用相同的Access,所以当我需要更改它时,我必须全力以赴,但我永远不知道谁在实际使用它。
答案 0 :(得分:6)
更新:不是阅读和解析.ldb / .lacdb文件,更好的方法是使用知识库文章中描述的Access OLEDB提供程序的“用户名册”功能
https://support.microsoft.com/en-us/kb/285822
和另一个SO问题
Get contents of laccdb file through VBA
<小时/> 原始答案:
我刚才把以下内容放在一起。它看起来很有希望但后来我发现计算机在断开连接时不会立即从锁定文件中删除。相反,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
答案 1 :(得分:4)
易。在记事本(或任何文本编辑器)中打开.ldb文件,您可以看到机器名称。
答案 2 :(得分:4)
RE:我怎么知道谁在使用我的Access数据库? •例如:有人打开了Access数据库并创建了.ldb文件,我想查看谁打开该数据库的列表(可能不止一个人)。
在寻找其他东西的时候发生了这件事,我想我可能会分享我为此做的事情。请注意,这假定主机(数据库文件所在的计算机)使用文件共享来提供对文件的访问。
您需要在主机上,或有权连接到该计算机。
单击“开始” 右键单击“我的电脑”,然后选择“管理”
如果您不在主机上,请右键单击“计算机管理”并输入主机名称
展开“共享文件夹”,然后点击“打开文件” 右侧是当前打开的文件列表,其中包含每个当前用户的用户名
答案 3 :(得分:1)
我同意Gord的原始答案。我在数据库上使用了此代码,似乎有一种解决方法,可以在数据库退出时将计算机从CurrentConnections中取出。
我把它放在我的主菜单上,因为它一直打开直到用户退出。我在表单上使用了unload事件来使其正常工作,并且效果很棒!这是我的代码
p.s。忽略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