断开与MS Access数据库的所有打开连接

时间:2010-07-19 17:36:48

标签: c# ms-access

我需要在Access数据库上执行压缩和修复操作。为此,需要关闭与数据库的所有打开连接。不幸的是,有一些开放的连接,我不能总是正确地追踪和关闭。有没有办法通过代码断开所有打开的连接?

3 个答案:

答案 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

我希望你觉得这很有帮助。