我需要在Access数据库上执行压缩和修复操作。为此,需要关闭与数据库的所有打开连接。不幸的是,有一些开放的连接,我不能总是正确地追踪和关闭。有没有办法通过代码断开所有打开的连接?
答案 0 :(得分:4)
与文本文件或位于磁盘上的简单电源点文件相比,访问文件没有什么特别之处。我们在这里谈论一个平面jane windows文件。
所以,你真正的问题是,你可以断开一个打开word文件的进程或刚刚碰巧坐在硬盘上的任何旧文件吗?
您可能能够终止进程和连接,但是再次无法确保将发生对该word文件(或访问mdb文件)的挂起数据写入。
所以,据我所知,即使您可以确定哪个进程打开了该power-point文件,我认为您不能可靠地终止该进程并关闭连接到已打开的文件并确保等待处理要写的数据实际上是写的。在等待写入磁盘的更新方面,您无法知道该代码和进程有哪些待处理。
虽然故障写出功率点文件中的待处理数据可能不是什么大问题,但就数据而言,你要求真正的麻烦。
这里唯一真正的方法是正常关闭已打开Windows文件的应用程序/进程。
关于您可以尝试的所有代码都是获取该文件的独占使用,如果您不能这样做,那么您必须通知用户在独占使用该文件之前无法使用压缩文件获得。
您当然可以在计算机上打开管理工具,并检查打开文件的用户,但查看这些用户连接的风险由您自行承担。
答案 1 :(得分:0)
答案 2 :(得分:0)
我知道这是一个迟到的答案,但我在这里......
虽然确定数据是否已保存是另一个问题,但如果这不是问题,则根据您的设置,有多个选项可用。假设MS Access数据库并且您在Windows网络上,并且您知道用户登录的计算机名称,这可能是一个选项:
Public Function StopProcess(PC As String) As Boolean
On Error GoTo Errhandler
Dim strComputer As String
Dim objWMIService As Variant
Dim colProcessList As Variant
Dim objProcess As Variant
' Add the user domain
strComputer = PC & ".yourdomain.com"
Set objWMIService = GetObject(_
"winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery(_
"SELECT * FROM Win32_Process WHERE Name = 'msaccess.exe'")
' Note: authority to do this must be provided prior for this function working
' Also, note this kills all open MS Access database the user has open
For Each objProcess In colProcessList
Call objProcess.Terminate
Next
Errhandler:
On Error Resume Next
End Function
然后,要查看哪些用户仍然登录,您可以通过执行以下过程outlined by Microsoft in a KB来查询JET数据库:
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.Open "Data Source=" & Path
Set rs = cn.OpenSchema(adSchemaProviderSpecific, , _
"{947bb102-5d43-11d1-bdbf-00c04fb92675}")
If not rs.EOF Then
' Note: Fields 0 = COMPUTER_NAME, 1 = LOGIN_NAME, _
' 2 = CONNECTED, 3 = SUSPECT_STATE
Debug.Print rs.Fields(0) & " - " & _
rs.Fields(1) & " - " & _
rs.Fields(2) & " - " & _
rs.Fields(3)
End If
我希望你觉得这很有帮助。