如何自动断开空闲用户与 MS Access DB 的连接?

Posted

技术标签:

【中文标题】如何自动断开空闲用户与 MS Access DB 的连接?【英文标题】:How can I automatically disconnect idle users from a MS Access DB? 【发布时间】:2019-10-11 04:30:45 【问题描述】:

MS Office 365 专业增强版,Access 2007 - 2016

问题来了……

我在共享文件服务器上有一个 MS Access 数据库,来自许多站点的许多用户可以访问该数据库,每周进行一些小的编辑。有时,具有活动连接的用户会突然关闭他们的客户端服务器(他们的笔记本电脑),留下与数据库的悬空连接,导致数据库处于无法打开的边缘。消息表明它已损坏,修复它的选项只是挂起。没什么大不了的,因为我有一个任务计划程序作业,每 3 小时备份(复制)一次数据库,我可以使用最近的备份来恢复。但是我什至无法使用备份删除/破坏数据库,因为悬空进程已连接并且 Windows 拒绝让我删除它(这本身就是 IMO 的一个问题)。

解决方法是找到连接,将其杀死,删除 .accdb 和 .laccdb,然后将其替换为备份。但不幸的是,我没有找到/终止连接的权限,所以我必须让 IT 部门的人去做这件事(可能需要很长时间,而且我经常遇到的人不知道该怎么做)。

真正缓解该问题的是对空闲超过 x 分钟的客户端进程自动断开数据库连接。我使用表格看到了类似的东西。但是我的用户直接编辑表格中的单元格(他们喜欢用 ExCel 样式编辑表格)。我搜索了数据库选项,但一般没有看到为数据库设置空闲超时/断开连接的选项。

问题:有没有办法像这样设置空闲超时,在 x 分钟后关闭数据库连接?

问题:鉴于所述问题,是否有另一种方法可以防止这些数据库“损坏”。我所读到的所有内容都类似于“教育您的用户在完成后关闭 Access”。用户太多,我怀疑他们会注意。

问题:Access 似乎是一个不那么健壮的数据库,但用户确实想要 ExCel 风格的界面(在没有表格的情况下编辑记录中的单元格)。创纪录的锁定机制似乎运作良好。而且我喜欢这样一个事实,即我可以轻松设置触发器和约束以保持数据质量,使用 SQL 查询事物等……(ExCel 对此不太好)。但是,如果有比 Access 更好的选择,我会全力以赴。

感谢您的任何想法!

【问题讨论】:

accessmvp.com/JConrad/accessjunkie/kickoff.html 有什么理由这不起作用?这是“ms 访问空闲超时”返回的第二个谷歌结果 @ChanceFinley 你自己检查过代码吗?您链接到的东西要求客户还活着,并让您主动选中一个框以将其踢出。这根本不是 OP 想要的。此外,该页面上的大多数链接都已失效。 【参考方案1】:

这是一个很常见的问题,没有简单的解决方案。

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

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

    此方法所需的代码描述为here on MS docs,它只需要为数据表(表/查询)添加一些内容。

    此方法的限制是您要为多任务用户关闭 Access。如果他们有一段时间不接触 Access,它就消失了,这不是很好的 UX。

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

    使用 WinAPI 在启动时启动计时器(也可以是带有计时器的隐藏表单)。使用GetLastInputInfo 验证用户在定时器的设定时间段内没有发送任何输入。如果没有,请关闭 Access。

    这有一个限制,即任何输入(例如,鼠标经过不稳定的桌子时移动一点点)都会重置计时器。

如果您在实现其中任何一个方面遇到问题,我可以提供示例代码。

【讨论】:

如果您有解决方案 2 的示例代码,那就太好了。我实际上是一个在我的舒适区之外涉足这些东西的 linux 人。我的 Access DB 解决方案“卡住”了,现在我必须支持它。此外,最好在此论坛中提供示例代码以供将来其他人查看。谢谢。 等等,它刚刚发生,用户通常会在笔记本电脑上运行十几个或更多的东西。如果他们在任何窗口中都处于活动状态,计时器会被重置(选择 2)吗?如果是这样,那是行不通的。 是的,任何和所有操作都会重置选项 2 的计时器。听起来选项 1 可能是更好的选择。【参考方案2】:

由于 Erik 解释的限制,您更好的选择是(如果尚未完成)将数据库拆分为前端和后端,convert后端到 SQL Server(Express 版可免费使用),然后分发然后使用我的文章中描述的方法将前端到用户的机器上(如果您没有帐户,请浏览链接“阅读全文”):

Deploy and update a Microsoft Access application with one click

这将使您完全摆脱让您忙碌的艰巨任务。

【讨论】:

如果每个用户都有自己的数据库副本,那么其他用户如何看到一个用户的更改? 它只是分发的前端。后端是共享的。如果您尚未拆分数据库,请执行此操作 - 有一个用于此操作的向导。【参考方案3】:

这里有一些显示 prmoise 的东西,来自 https://bytes.com/topic/access/answers/942650-can-you-force-access-quit-when-pc-goes-into-standby-mode

想法是运行一个运行访问的 vbs。如果检测到掉电事件,它将断开 DB 而不是留下一个悬空进程。

Option Explicit

Dim objAccess, objWMIService, colItems

Set objAccess = CreateObject("Access.Application")
objAccess.Visible = True
objAccess.OpenCurrentDatabase "\\vausamd20\SCBUDV_Infra\dbg_taskdb.accdb"

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
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

如果有人认为这是一个好主意或坏主意,欢迎 cmets !

【讨论】:

我认为想出创可贴是浪费时间。 Gustav 编写了稳定环境的解决方案 - 分布式前端,服务器后端。

以上是关于如何自动断开空闲用户与 MS Access DB 的连接?的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道 MS Access DB 损坏的实际原因

如何进入IDLE中断

MS Access ADP 断开连接的记录集恢复

MySql连接空闲8小时自动断开的原因及连接池配置方法

JET OLEDB 参数如何将字符串与 Access DB 中的文本字段进行比较

如何通过组策略控制远程主机空闲时间自动断开并注销