【发布时间】:2011-03-18 01:02:26
【问题描述】:
我需要对 Access 数据库执行压缩和修复操作。为此,需要关闭与数据库的所有打开连接。不幸的是,有一些打开的连接我不一定总是能正确地追踪和关闭。有没有办法通过代码断开所有打开的连接?
【问题讨论】:
我需要对 Access 数据库执行压缩和修复操作。为此,需要关闭与数据库的所有打开连接。不幸的是,有一些打开的连接我不一定总是能正确地追踪和关闭。有没有办法通过代码断开所有打开的连接?
【问题讨论】:
与文本文件或磁盘上的简单电源点文件相比,访问文件没有什么特别之处。我们在这里讨论的是一个平面简窗口文件。
那么,您真正的问题是,您能否断开打开了 word 文件或恰好位于硬盘驱动器上的任何旧文件的进程?
您可能能够终止进程和连接,但是您将再次无法确保将挂起的数据写入该 word 文件(或访问 mdb 文件)。
因此,据我所知,即使您可以确定哪个进程打开了该 powerpoint 文件,我认为您不能可靠地终止该进程并关闭与打开文件的连接并确保挂起要写入的数据实际上会被写入。在等待写入磁盘的更新方面,您无法知道该代码和进程有哪些待处理。
虽然在 power point 文件中写出未决数据可能不是什么大问题,但如果是数据,你就自找麻烦了。
这里唯一真正的方法是优雅而正确地关闭打开该 windows 文件的应用程序/进程。
您的所有代码都可以尝试获得文件的独占使用权,如果您不能这样做,那么您必须通知用户在文件独占使用之前无法进行压缩获得。
您当然可以打开计算机上的管理工具,并检查打开文件的用户,但终止这些用户连接需要您自担风险。
【讨论】:
【讨论】:
我知道这是一个迟到的答案,但我走了......
虽然确定数据是否已保存完全是另一个问题,但如果这不是问题,根据您的设置,有几个选项可用。假设 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
我希望这对您有所帮助。
【讨论】: