其实,我有2个问题:
1.我怎么可能会看到谁在用我的Access数据库?
- 例如:有某人打开Access数据库,它创建的.ldb文件,我想看到谁打开的数据库(它可能是一人以上)的列表。
2.我怎么可能会看到谁在使用链接的表?
- 例如:我有10个不同的Access数据库,和所有的人都使用同一个链接表。 我想看看是谁在使用该链接的表。
我甚至不知道这是否是真的有可能,但我真的很感谢您的帮助!
为了您的信息:主要的问题是,很多人使用同一个网络驱动器一样访问,所以当我需要改变它,我必须踢他们都出去,但谁是真正使用它,我不知道。
更新:而不是读和解析的.ldb / .lacdb文件,更好的办法是使用Access OLEDB提供的“用户名单”功能的知识库文章中描述
https://support.microsoft.com/en-us/kb/285822
而在其他SO质疑
通过VBA获取laccdb文件的内容
原来的答案:
我下面前一阵子放在一起。 它看起来很有前途,但后来我发现,计算机不会立即从锁文件删除时断开连接。 相反,喷气/ 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
简单。 用记事本打开.ldb文件(或任何文本编辑器),你可以看到机器的名字。
RE:我怎么可能会看到谁在用我的Access数据库? •例如:有某人打开Access数据库,它创建的.ldb文件,我想看到谁打开的数据库(它可能是一人以上)的列表。
只是碰到这种事情时找别的东西,我想我会分享我这个做。 请注意,这个假设主机计算机(在其数据库文件所在的计算机)使用文件共享来提供对文件的访问。
你将需要在主机上,或有权连接到机器。
单击开始右键单击我的电脑,选择管理
如果你不是在主机上,右键单击“计算机管理”,然后输入主机名
展开“共享文件夹”,然后点击“打开文件”。在右边是当前打开的文件的用户名对每个当前的用户列表
我同意和Gord的原来的答复。 我用我的数据库的代码,它似乎有在DB的出口没有被取出CurrentConnections的电脑周围的方式。
我把这个我的主菜单形式,因为它始终是敞开的,直到用户退出。 我用卸载事件的窗体上得到这个工作,和它的作品真棒! 这里是我的代码
PS忽略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