Ms access 如何自动断开空闲用户与MS Access数据库的连接?

Ms access 如何自动断开空闲用户与MS Access数据库的连接?,ms-access,Ms Access,MS Office 365 ProPlus,访问权限2007-2016 问题是 我在共享文件服务器上有一个MS Access数据库,来自许多站点的许多用户可以访问该数据库,以便每周进行一些小的编辑。偶尔,具有活动连接的用户会突然关闭其客户机服务器(笔记本电脑),留下与数据库的悬空连接,从而导致数据库处于无法打开的状态。消息表明它已损坏,修复它的选项只是挂起。这没什么大不了的,因为我有一个任务调度程序作业,每3小时备份(复制)一次数据库,我可以使用最新的备份进行恢复。但我甚至不能用备份删除/关闭数

MS Office 365 ProPlus,访问权限2007-2016

问题是

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

解决方案是找到连接,终止连接,删除.accdb和.laccdb,然后用备份替换它。但不幸的是,我没有找到/终止连接的权限,因此我必须让某人参与其中才能做到这一点(可能需要很长时间&我遇到的人通常不知道如何做到这一点)

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

问题:有没有办法设置这样的空闲超时,在x分钟后关闭DB连接

问题:鉴于上述问题,是否有其他方法来防止这些DB“腐败”。我读到的关于这一点的所有内容都是“教育用户在完成访问后关闭访问”。用户太多了,我怀疑他们会不会注意

问:Access似乎不是一个强大的数据库,但用户确实想要ExCel风格的界面(编辑没有表单的记录中的单元格)。创纪录的锁定机制似乎运作良好。我喜欢这样一个事实:我可以轻松地设置触发器和约束来维护数据质量,使用SQL查询数据,等等。。。(这方面ExCel不太好)。但如果有比访问更好的选择,我洗耳恭听


谢谢你的建议

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

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

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

    描述了此方法所需的代码,它只需要添加一些数据表(表/查询)

    此方法有一个限制,即您正在关闭多任务用户的访问。如果他们有一段时间不接触Access,它就会消失,这不是什么好事情

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

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

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


  • 如果您在实现这两个方面有困难,我可以提供示例代码。

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

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

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

    描述了此方法所需的代码,它只需要添加一些数据表(表/查询)

    此方法有一个限制,即您正在关闭多任务用户的访问。如果他们有一段时间不接触Access,它就会消失,这不是什么好事情

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

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

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


  • 如果您在实现这两个方面有困难,我可以提供示例代码。

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


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

    由于Erik解释的限制,您更好的选择是(如果尚未完成)将数据库拆分为前端和后端,将后端转换为SQL Server(Express edition可免费使用),然后将前端分发到
    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