【问题标题】:MS Access dropping connection to ODBC tables after long period of inactivity长时间不活动后 MS Access 断开与 ODBC 表的连接
【发布时间】:2016-09-21 09:26:58
【问题描述】:

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

通过关闭 Access 并再次打开它来解决问题。

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

有什么想法吗?

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    很遗憾,目前还没有现成的方法来解决这个问题。

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

    因此,如果您的计算机休眠或将网卡置于休眠状态,您经常会失去连接 - 一旦失去连接,您必须重新启动。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的建议,但即使我已经将打开的表单绑定到表格,也会出现问题。
      • 好的。你没有提到那个。
      【解决方案3】:

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

      在这种情况下,我要做的就是在 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
      

      仔细观察我的 cmets,尤其是如果您已将表链接到多个 MySQL 数据库。它会在不适应的情况下破坏其中的一些。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 2012-10-20
        • 2011-03-18
        • 1970-01-01
        • 2019-10-11
        • 2013-03-17
        相关资源
        最近更新 更多