强制所有用户断开与2010 Access后端数据库的连接

时间:2012-06-05 21:24:34

标签: ms-access

我们有多用户前端/后端MS Access 2010应用程序。我们添加了一个进程,当我们想要在后端进行紧凑和修复等工作时,它将关闭远程前端。这是基于计时器的检查表字段,如果有某个值将关闭应用程序。

我会检查用户是否连接到数据库:

  • 我有登录/注销过程,可以看到谁还在登录(其形式基本上是错误的,例如他们关闭表格,但前端仍然打开)。

  • 我使用.ldb文件查看器查看是否还有任何连接

两个问题:

  • 如果使用ldb viewer无法查看到支持的连接,是否有可能存在?

  • 是否有100%的防弹证据强制断开后端的所有连接?

4 个答案:

答案 0 :(得分:6)

用户将“锁”放入LDB。 LDB是一种MS Access锁的数据库。

用户还将“锁定”放在LDB和MDB上。这些锁是Windows和Windows网络提供的本机数据库原语的一部分。

如果ldb没有锁 IN ,则用户不会写入MDB。

如果没有锁定 ON mdb,则用户不使用该Windows / Networking服务。

要获得MDB的独占锁定,您需要两者。当LDB有条目显示其他人正在使用数据库时,MSAccess将不允许您进行独占锁定,并且当Windows有锁定显示其他人正在使用数据库时,Windows不会给您一个独占锁。

要100%防弹清空LDB,请删除LDB。这就是为什么Access总是尝试在关闭时删除LDB。如果Access崩溃,或网络断开,或PC或服务器关闭,LDB将具有尚未删除的数据(“锁定”)。你可以通过删除LDB来摆脱它们。

如果用户在LDB上仍有Windows /网络锁,则访问将无法删除LDB。由于Access忽略现有的“锁定”条目以清除损坏的“锁定”条目,因此这是Access / Windows阻止Access删除LDB而另一个用户仍在使用它的方式。

如果存在Windows锁定或存在Access / LDB“锁定”,则无法获得独占所有权。如果仅存在Access / LDB“锁定”,则可以删除LDB,然后获得独占所有权。

如果存在任何Windows /网络锁定,则您使用Access执行的任何操作都不允许您断开其他人与网络的连接。您需要转到托管该文件的服务器/ PC,并强制断开连接。 Access不是为您执行此操作的网络管理程序。

最后我看了一下,Windows Server默认设置为在网络会话丢失15分钟后超时断开的文件连接。因此,如果您关闭PC,请等待15分钟,然后Windows /网络锁将进入(默认时间)。或者:管理工具,计算机管理,系统工具,共享文件夹,会话。选择要解锁的文件,然后删除会话。

答案 1 :(得分:5)

存在一个修复程序,我已将其用于我维护的MS-Access应用程序。但是,它不方便,并且实施起来并不简单。

首先,关于锁定文件和锁定文件的一些背景知识。

锁定文件是一个有用的工具,但它是一个指示器,而不是实际锁定:您可以编辑它但不起作用。

实时MS-Access会话可以在.accdb或.mdb后端数据库文件上保留文件锁定,如果他们编辑数据,更改对象(例如:索引表)或执行维护任务。该列表中的最后两个项目很少见 - 需要花费一些精力来影响您在会话中打开的数据库之外的另一个数据库文件,但有时会在野外观察 - 但关闭这些会话应释放锁定和几乎总是会。

崩溃的MS-Access会话可以在.accdb或.mdb后端数据库文件上保留文件锁定。强行重启违规机器应该释放锁定,而主要是

您可以使用锁定文件(.ldb或.laccdb)跟踪那些

使用ODBC或ADO到Access数据库的第三方报告应用程序应将其连接设置为只读,以便它们无法锁定该文件。 如果您很幸运,系统所有者将使用您控制的dsn文件,您可以看到该设置。

一些报告应用程序,如QLikView,是不透明的接口,需要完整的文件名,没有人知道接下来会发生什么:也许它会锁定,也许它不会。 您无法知道

某些报告应用程序 - 以及Excel数据透视表 - 可能会链接到您的数据库,而所有者根本就不会告诉您。如果他们的连接配置错误,他们可以在检索时锁定您的表:并且终止客户端会话可以使锁定到位。无聊的Excel用户看着缓慢的转动'刷新'一直这样做。

更糟糕的是,某些第三方系统可能需要编写数据:应该避免这种情况 - 通过Access客户端应用程序! - 但你总是不能做出这个决定。

如果您很幸运,连接对象已正确配置,因此计算机ID位于连接字符串中,确保它在锁定文件中出现并允许您使用锁定定位计算机......

也许他们这样做:通常他们不会。

...请注意,对于对您而言重要的问题,行锁定查询,页锁定查询和表锁定查询在功能上是相同的:如果您需要在&#处执行某些操作(如压缩和修复) 39;文件'级别,文件被锁定。在锁定被释放之前,您已被锁定。

您可能或可能无法识别机器。您可能会也可能无法将其强制退出网络。他们可能会在正常操作中成功释放锁定,如果它们崩溃,他们几乎肯定会赢得锁定。

所以:它不是一张漂亮的照片。

在企业环境中,您的最佳解决方案是通过“手指”直接与网络管理员联系。用于识别锁定数据库文件的人员,联系用户的能力以及断开违规会话的能力。

失败的方式是:

  • 如果您的组织结构不允许您建立该组织结构 沟通的线,你搞砸了。
  • 如果您的组织的网络管理员没有这种能力 或者在有用的时间范围内执行此操作的权限,你已经搞砸了。
  • 如果您的组织的网络管理员选择不这样做, 你搞砸了。

但是,我确实为我的MS-Access应用程序做了修复:

我使用的解决方法非常具有攻击性 - 并不是“核选项”。把铲子穿过建筑物的电源,或者屈从于系统管理员对人类牺牲的要求,但是实施起来非常不愉快和荒谬的工作:

  1. 将客户端 - 您的MS-Access前端应用程序 - 配置为 轻松地在命名的后端数据库之间切换。
  2. 同样,您编写的dsn文件并允许其他应用 使用应该可以访问预先存在的脚本来编辑 ' DBQ ='或'数据来源='子句到新文件名。
  3. 获取数据库文件的副本,将其下载到本地临时文件 您需要执行的维护工作的文件夹,并将其发回 取决于您的应用程序'数据'新名称下的文件夹。
  4. 现在运行' Change back-end'脚本或VBA功能......
  5. ......和任何使用旧的,被锁定的人一起下地狱 后端文件。
  6. 提示:实施您的前端应用程序,以便定期轮询后端数据库(或其他一些资源,最糟糕的情况是完全锁定) #39; 维护关闭'或者' 更改数据库'指导是一个聪明的东西放在你的主菜单'形式的计时器事件。

    此外,还有代码可以自动切换链表的源数据库。

答案 2 :(得分:3)

  

是否有可能存在与支持的连接   用ldb viewer无法查看?

是的,我曾多次遇到过后端被锁定的问题,但我看不到任何有ldb查看器的内容。在这些情况下,我们甚至导致在用户访问数据库的机器上进行硬关机。可怕的解决方案,但在需要的时候,你有时会绝望。

  

是否有任何防弹100%的强制断开方式   来自后端的所有连接?

不,我无法找到100%强制所有人退出后端数据库的方法。我发现最接近完美的是使用Chris Symonds Timeout-Force Out code located on Utter Access

  

该数据库完成了几项任务:

     
      
  1. 允许开发人员使用db转到任何PC并强制所有用户关闭分割数据库,以便开发人员可以专门打开db   修改/维护db。
  2.   
  3. 如果用户在开发人员设置的指定分钟数内未使用数据库,则会将用户从数据库中删除。
  4.   
  5. 允许开发人员每天指定一个时间强制所有用户关闭split db并关闭db以进行备份,编译或其他任何操作。
  6.   
  7. 所有功能都是可选的,可以在没有额外编码的情况下绕过,只使用每个数据库所需的功能。
  8.   

我实现了他的代码,它在大约99%的时间内工作,但仍然存在MS Access有点敏感的情况,我无法理解为什么数据库被锁定或迫使每个人都出局。

答案 3 :(得分:2)

我会检查用户是否连接到数据库

如果您需要独占打开数据库,可以跳过其他检查,然后检查是否可以执行此操作。

Public Function CheckExclusive(ByVal pFullPath As String) As Boolean
    Dim blnReturn As Boolean
    Dim cn As Object
    Dim strConnection As String

On Error GoTo ErrorHandler

    strConnection = "Provider=" & _
        CurrentProject.Connection.Provider & _
        ";Data Source=" & pFullPath & ";"
    Set cn = CreateObject("ADODB.Connection")
    cn.Mode = 12& ' adModeShareExclusive '
    cn.Open strConnection
    blnReturn = True
    cn.Close

ExitHere:
    On Error Resume Next
    Set cn = Nothing
    On Error GoTo 0
    CheckExclusive = blnReturn
    Exit Function

ErrorHandler:
    blnReturn = False
    GoTo ExitHere
End Function

然后使用db文件的完整路径调用该函数。

If CheckExclusive("C:\SomeFolder\YourDb.mdb") = True Then
    ' do what you need here which requires exclusive access: '
    '     make backup; compact; whatever '
End If