我们有多用户前端/后端MS Access 2010应用程序.我们添加了一个进程,当我们想要在后端进行紧凑和修复等工作时,它将关闭远程前端.这是基于计时器的检查表字段,如果具有某个值将关闭应用程序.
我做了两项检查,看看用户是否连接到数据库:
我有登录/注销过程,可以看到谁仍然登录(其形式基础因此是错误的,例如他们关闭形式,但前端仍然是开放的).
我使用.ldb文件查看器来查看是否还有任何连接
两个问题:
如果用ldb查看器无法查看到支持的连接是否有可能存在?
是否有任何防弹证明100%强制断开后端的所有连接?
用户将"锁"放入LDB.LDB是MS Access的一种锁数据库.
用户还将"锁定"放在LDB和MDB上.这些锁是Windows和Windows网络提供的本机数据库原语的一部分.
如果没有锁在六味地黄丸,用户没有写入到MDB.
如果没有锁打开的MDB,用户不使用的Windows /网络服务.
要获得MDB的独占锁定,您需要两者.当LDB具有显示其他人正在使用数据库的条目时,MSAccess将不允许您进行独占锁定,并且当Windows具有显示其他人正在使用该数据库的锁时,Windows将不会给您独占锁.
要100%防弹清空LDB,您删除LDB.这就是为什么Access总是尝试在关闭时删除LDB.如果Access崩溃,或网络断开,或PC或服务器关闭,LDB将具有尚未删除的数据("锁定").你可以通过删除LDB来摆脱它们.
如果用户仍在LDB上具有Windows /网络锁,则Access将无法删除LDB.由于Access忽略现有的"锁定"条目以清除损坏的"锁定"条目,因此这是Access/Windows阻止Access删除LDB而另一个用户仍在使用它的方式.
如果存在Windows锁定或存在Access/LDB"锁定",则无法获得独占所有权.如果仅存在Access/LDB"锁定",则可以删除LDB,然后获得独占所有权.
如果存在任何Windows /网络锁定,则您使用Access执行的任何操作都不允许您将其他人与网络断开连接.您需要转到托管该文件的服务器/ PC,并强制断开连接.Access不是为您执行此操作的网络管理程序.
最后我看,Windows Server默认设置为在网络会话丢失15分钟后超时断开的文件连接.因此,如果您关闭PC,请等待15分钟,然后Windows /网络锁将进入(默认时间).或者:管理工具,计算机管理,系统工具,共享文件夹,会话.选择要解锁的文件,然后删除会话.
存在修复,我已经为我维护的MS-Access应用程序准备好了.然而,它不方便,实施起来并不简单.
首先,关于锁定文件和锁定文件的一些背景知识.
锁定文件是一个有用的工具,但它是一个指标,而不是实际的锁:您可以编辑它,但没有任何效果.
实时MS-Access会话可以在.accdb或.mdb后端数据库文件上保留文件锁定,如果它们编辑数据,更改对象(例如:索引表)或执行维护任务.该列表中的最后两个项目很少见 - 需要花费一些精力来影响您在会话中打开的数据库之外的另一个数据库文件,但有时会在野外观察 - 但关闭这些会话应释放锁定并且几乎总是将.
崩溃的MS-Access会话可以在.accdb或.mdb后端数据库文件上保持文件锁定.强行重启违规机器应该释放锁,而且大多数都是.
您可以使用锁定文件(.ldb或.laccdb)跟踪这些文件
使用ODBC或ADO到Access数据库的第三方报告应用程序应将其连接设置为只读,以便它们无法锁定该文件.如果幸运的话,系统所有者使用您控制的dsn文件,您可以看到该设置.
一些报告应用程序,如QLikView,是不透明的接口,需要完整的文件名,没有人知道接下来会发生什么:也许它会锁定,也许它不会.你无从知晓.
某些报告应用程序 - 以及Excel数据透视表 - 可能会链接到您的数据库,而所有者根本就不会告诉您.如果他们的连接配置错误,他们可以在检索时锁定您的表:并且终止客户端会话可以使锁定到位.无聊的Excel用户一直在观看慢速"刷新".
更糟糕的是,一些第三方系统可能需要编写数据:这应该避免 - 通过Access客户端应用程序! - 但你并不总能做出这个决定.
如果幸运的话,连接对象配置正确,因此机器ID位于连接字符串中,确保它在锁定文件中出现并允许您使用锁定机器...
也许他们这样做:他们通常不这样做.
...请注意,对于对您而言重要的问题,行锁定查询,页锁定查询和表锁定查询在功能上是相同的:如果您需要在"文件"级别执行某些操作(如压缩和修复),该文件被锁定.在锁被释放之前,你就被锁定了.
您可能或可能无法识别机器.您可能会也可能无法将其强制退出网络.他们可能会或不会在正常操作中成功释放锁定,如果它们崩溃,它们几乎肯定不会.
所以:这不是一张漂亮的照片.
在企业环境中,您的最佳解决方案是使用"finger"工具直接与网络管理员联系,以确定锁定数据库文件的人员,联系用户的能力以及断开违规会话的能力.
失败的方式是:
我使用的解决方法非常具有侵略性 - 不是将铁锹穿过建筑物的电源,或者屈服于系统管理员对人类牺牲的要求的"核选择",但是非常不愉快和实施的荒谬工作量:
提示:实现您的前端应用程序,以便定期轮询后端数据库(或其他一些资源,最糟糕的情况是完全锁定),对于" 维护关闭 "或" 更改数据库 "指令是明智之举放入"主菜单"表单的计时器事件.
此外,还有代码可以自动切换链接表的源数据库.
“我做了两次检查来查看用户是否连接到数据库”
如果您需要以独占方式打开数据库,您可以跳过其他检查,只检查是否可以这样做。
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
Run Code Online (Sandbox Code Playgroud)
然后使用数据库文件的完整路径调用该函数。
If CheckExclusive("C:\SomeFolder\YourDb.mdb") = True Then
' do what you need here which requires exclusive access: '
' make backup; compact; whatever '
End If
Run Code Online (Sandbox Code Playgroud)