我有一个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项。