MS Access在长时间不活动后放弃与ODBC表的连接



我有一个Access 2010前端,在本地MySQL服务器(Windows)上有多个链接表,通过ODBC连接。大多数情况下,它工作得很好,但是如果Access打开几个小时但不使用,Access会断开连接。当再次打开表单时,我得到一个ODBC错误。

通过关闭Access并重新打开它可以修复这个问题。

我猜这是一个超时问题,但我不是一个访问专家。似乎我需要一种方法来检查有效的ODBC连接,并在必要时重新连接?

任何想法?

不幸的是,目前还没有现成的方法来解决这个问题。

这个问题通常是计算机电源管理的结果。如果计算机进入睡眠状态,或者计算机将网卡置于睡眠状态,那么您就有麻烦了,您必须重新启动Access。

所以如果你的电脑处于睡眠状态,或者让网卡处于睡眠状态,你经常会失去连接——一旦失去连接你必须重新启动。

还有一些windows 10的硬件也有问题,因为windows 10的默认设置是快速启动(这意味着内核的副本,最重要的是加载和初始化的驱动程序的副本被写入磁盘,用于缩短启动/启动时间)。

如果你在windows 10上看到这个问题,那么我会考虑禁用快速启动,因为这将"总是"强制冷重新初始化驱动程序(例如那些网卡)。如果确定这是一个问题,我也会考虑关闭"睡眠"模式(并且这些违规的计算机在唤醒后也会看到这个问题)。

编辑:我还应该指出,ODBC连接的一些"测试"不会解决这个问题,因为如前所述,一旦丢失,您必须重新启动Access。

您可以尝试一个老技巧-在启动时打开绑定到表的简单表单并隐藏该表单,并保持它打开

我很少在MySQL表上工作几个小时,所以我从来没有遇到过这个问题,但在我看来,这听起来像是一个与驱动相关的问题或功能。

在这种情况下我要做的是刷新表的连接在VBA,循环在你的TableDef对象。

例如,创建一个带有1小时计时器的隐藏表单,并在form_timer中添加以下代码:
Sub Form_Timer()
    Dim tDef As DAO.TableDef
    Dim strConString As String
    Dim strMySQLServer As String
    Dim strMySQLDB As String
    Dim strMySQLUser As String
    Dim strMySQLPass As String
        ' ADAPT THIS :
        strMySQLServer = ""
        strMySQLDB = ""
        strMySQLUser = ""
        strMySQLPass = ""
     strConString = "ODBC;DRIVER={MySQL ODBC 5.1 Driver};Server=" & strMySQLServer & ";Database=" & strMySQLDB & ";Uid=" & strMySQLUser & ";Pwd=" & strMySQLPass & ";Option=3"
     For Each tDef In CurrentDb.TableDefs
        ' You probably have to adapt the folowing if
        ' Debug and inspect  the connection string of your actual MySQL Linked tables
         If Left(tDef.Connect, 4) = "ODBC" And InStr(tDef.Connect, "MySQL") > 0 Then
             tDef.Connect = strConString
             tDef.RefreshLink
         End If
     Next tDef
End Sub

仔细看我的注释,特别是如果你的表链接到几个MySQL数据库。这将打破一些不适应。

您可能还必须调整MySQL驱动程序后面的连接字符串,或者使用您在ODBC控制面板中指定的DSN项。

最新更新