【问题标题】:Disconnect All Open Connections to MS Access Database断开与 MS Access 数据库的所有打开连接
【发布时间】:2011-03-18 01:02:26
【问题描述】:

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

【问题讨论】:

    标签: c# ms-access


    【解决方案1】:

    与文本文件或磁盘上的简单电源点文件相比,访问文件没有什么特别之处。我们在这里讨论的是一个平面简窗口文件。

    那么,您真正的问题是,您能否断开打开了 word 文件或恰好位于硬盘驱动器上的任何旧文件的进程?

    您可能能够终止进程和连接,但是您将再次无法确保将挂起的数据写入该 word 文件(或访问 mdb 文件)。

    因此,据我所知,即使您可以确定哪个进程打开了该 powerpoint 文件,我认为您不能可靠地终止该进程并关闭与打开文件的连接并确保挂起要写入的数据实际上会被写入。在等待写入磁盘的更新方面,您无法知道该代码和进程有哪些待处理。

    虽然在 power point 文件中写出未决数据可能不是什么大问题,但如果是数据,你就自找麻烦了。

    这里唯一真正的方法是优雅而正确地关闭打开该 windows 文件的应用程序/进程。

    您的所有代码都可以尝试获得文件的独占使用权,如果您不能这样做,那么您必须通知用户在文件独占使用之前无法进行压缩获得。

    您当然可以打开计算机上的管理工具,并检查打开文件的用户,但终止这些用户连接需要您自担风险。

    【讨论】:

      【解决方案2】:

      这可能会引起您的兴趣:http://www.tek-tips.com/viewthread.cfm?qid=79802

      【讨论】:

        【解决方案3】:

        我知道这是一个迟到的答案,但我走了......

        虽然确定数据是否已保存完全是另一个问题,但如果这不是问题,根据您的设置,有几个选项可用。假设 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
        

        我希望这对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-09
          • 1970-01-01
          • 2012-12-11
          • 2019-04-15
          • 1970-01-01
          相关资源
          最近更新 更多