MS Office 365 Proplus,Access 2007-2016
这是问题...
我在共享文件服务器上有一个MS Access DB,许多网站的许多用户可以访问该服务器,每周进行一些小型编辑。有时,具有主动连接的用户会突然关闭其客户端服务器(其笔记本电脑(,从而使DB悬挂着连接,这导致了无法打开的Limbo的DB。消息表明它已损坏,修复它的选择只是悬挂。没什么大不了的,因为我有一个任务调度程序作业,可以每3小时备份DB(复制(DB,我可以使用最新的备份来还原。但是我什至无法使用备份删除/clobber DB,因为悬空过程已连接,Windows拒绝让我删除它(这本身就是一个问题IMO(。
解决方案是找到连接,杀死它,删除.ACCDB和.LACCDB,然后将其替换为备份。但是不幸的是,我没有私人找到/杀死连接,所以我必须让某人参与其中(可能需要很长时间我经常得到的人不知道该怎么做(。
真正减轻问题的是,对于闲置超过x分钟的客户流程的自动化数据库断开。我使用表格看到了与此类似的东西。但是我的用户直接在表中编辑了单元格(他们喜欢Excel样式编辑表单上的编辑(。我搜索了数据库选项,但看不到设置DB的空闲超时/断开连接的选项。
问题:有没有办法设置这样的空闲超时,该超时会在x分钟后关闭DB连接?
问题:考虑到问题,是否有另一种方法可以防止这些DB"腐败"。我所读到的有关此内容的所有内容都符合"教育您的用户在完成后关闭访问权限"的路线。用户太多了,我怀疑他们会注意的。
问题:访问似乎是一个不太强大的DB,但是用户确实希望Excel样式接口(在没有表单的记录中编辑单元格(。记录水平锁定机械似乎运行良好。我喜欢这样一个事实,即我可以轻松地设置触发器和约束来维持数据质量,与SQL一起查询事物等...(Excel不太好(。但是,如果有比访问更好的选择,那么我全都是耳朵。
感谢任何想法!
这是一个非常普遍的问题,没有简单的解决方案。
这个问题有两种主要方法:
-
使用隐藏的表单,并在启动时打开的计时器。如果打开表单/数据表格,以及该表单/数据表上的活动记录或活动控件是否更改,请随时检查表单。如果没有一段时间,请关闭访问。
此处在MS文档上描述了此方法所需的代码,仅需要一些数据表(表/查询(添加一些。
此方法的限制是,您正在为多任务处理的用户关闭访问。如果他们不触摸访问一段时间,那就消失了,那不是很棒的ux。
这里的另一个限制是,例如,用户不必要地将用户踢出去,因为他正在从另一个应用程序中移动数据,因此在积极使用数据库的同时,他的光标始终将其光标放在新记录上。
-
使用Winapi在启动时启动计时器(也可能是带有计时器的隐藏表单(。使用
GetLastInputInfo
验证用户是否尚未在计时器上发送设置期间的任何输入。如果没有,请关闭访问。这有这样的限制,即任何输入(例如,走过不稳定的桌子时移动一点点的鼠标(都会重置计时器。
如果您在实施这些方面遇到困难,我可以提供示例代码。
您的更好选项 - 由于Erik所解释的限制 - 将是(如果尚未完成的话(将数据库 splite em>转换将后端到SQL Server(Express Edition免费使用(,并且使用我的文章中所述的方法,然后使用 distribute 有一个帐户,浏览链接"阅读全文"(:
用一键部署并更新Microsoft Access应用程序
这将使您摆脱艰巨的任务,使您忙碌。
以下是显示prmoise的东西https://bytes.com/topic/access/answers/942650-can-you-force-access-quit-when-pc-goes-goes-into-stod-standby-mode
想法是运行运行访问的VB。如果感受到电源降低事件,它将断开DB的连接,而不是离开悬空过程。
Option Explicit
Dim objAccess, objWMIService, colItems
Set objAccess = CreateObject("Access.Application")
objAccess.Visible = True
objAccess.OpenCurrentDatabase "\vausamd20SCBUDV_Infradbg_taskdb.accdb"
Set objWMIService = GetObject("winmgmts:\.rootcimv2")
Set colItems = objWMIService.ExecNotificationQuery("Select * from
Win32_PowerManagementEvent")
Do While True
If colItems.NextEvent.EventType = 4 Then
objAccess.Quit
Set objAccess = Nothing
Set colItems = Nothing
Set objWMIService = Nothing
Exit Do
End If
Loop
如果有人认为这是一个好主意,则向评论开放!