我如何自动从MS Access DB中解开IDLE用户



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不太好(。但是,如果有比访问更好的选择,那么我全都是耳朵。

感谢任何想法!

这是一个非常普遍的问题,没有简单的解决方案。

这个问题有两种主要方法:

  1. 使用隐藏的表单,并在启动时打开的计时器。如果打开表单/数据表格,以及该表单/数据表上的活动记录或活动控件是否更改,请随时检查表单。如果没有一段时间,请关闭访问。

    此处在MS文档上描述了此方法所需的代码,仅需要一些数据表(表/查询(添加一些。

    此方法的限制是,您正在为多任务处理的用户关闭访问。如果他们不触摸访问一段时间,那就消失了,那不是很棒的ux。

    这里的另一个限制是,例如,用户不必要地将用户踢出去,因为他正在从另一个应用程序中移动数据,因此在积极使用数据库的同时,他的光标始终将其光标放在新记录上。

  2. 使用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

如果有人认为这是一个好主意,则向评论开放!

最新更新