Access 2013 DSNLess连接SQL Server断连后丢失表链接问题求助
Access前端DSNLess连接SQL Server后部分表链接丢失的解决方案
一、可能的触发原因
- 网络恢复时的连接时序冲突:Access在重连阶段会批量尝试恢复表链接,若前几个表的连接请求未及时得到SQL Server响应,Access会直接标记这些链接失效。
- 本地连接元数据损坏:网络中断瞬间,Access缓存的部分表连接信息可能出现损坏,恢复后无法自动修复。
- SQL Server连接池过载:网络恢复时大量前端同时发起重连请求,超出SQL Server连接池的承载上限,导致部分连接被拒绝,对应表的链接丢失。
二、自动检查并重连的VBA代码
以下代码可遍历所有链接表,验证连接有效性,失效则自动重新建立DSNLess链接:
Sub RefreshLinkedSQLTables() Dim tdf As TableDef Dim strConn As String ' 替换为你的DSNLess连接参数 strConn = "ODBC;DRIVER={SQL Server Native Client 11.0};" & _ "SERVER=你的服务器名称;" & _ "DATABASE=你的数据库名称;" & _ "Trusted_Connection=Yes;" For Each tdf In CurrentDb.TableDefs ' 过滤本地表和系统表,只处理链接表 If tdf.Connect <> "" And Left(tdf.Name, 4) <> "MSys" Then On Error Resume Next ' 通过打开快照验证连接状态 tdf.OpenRecordset dbOpenSnapshot, dbReadOnly If Err.Number <> 0 Then ' 连接失效,重新设置链接 tdf.Connect = strConn tdf.RefreshLink Debug.Print "已修复链接: " & tdf.Name End If On Error GoTo 0 End If Next tdf MsgBox "链接检查与修复完成", vbInformation End Sub
注意事项
- 替换代码中的
SERVER和DATABASE为实际值,驱动可根据你的环境调整(比如用{ODBC Driver 17 for SQL Server}适配新版本SQL Server)。 - 可以把这个宏绑定到前端的启动事件,或者通过窗体计时器定时执行,确保每次打开前端或定期检查链接状态。
三、预防措施
- 前置连接测试:在前端执行任何数据操作前,先跑一个简单的测试查询(比如
SELECT 1 FROM 任意小表),确认连接有效后再进行后续操作。 - 调整SQL Server连接池:联系管理员增大连接池的最大容量,避免瞬间重连导致的请求被拒。
- 避开高风险时段:如果业务允许,尽量不在网络不稳定或停电高发时段执行批量数据操作。
内容的提问来源于stack exchange,提问作者Mel Forsyth
相关产品推荐
相关产品推荐

