使用pyodbc操作含MySQL链接表的Access数据库时UPDATE报错求助
解决方案:Office 365下pyodbc执行Access跨表更新报错(-1611)
针对你遇到的通过pyodbc执行Access本地表与MySQL链接表关联更新时报-1611并发冲突错误(Access客户端执行正常,仅ODBC调用出错),以下是无需迁移至Office 2019的可行解决办法:
1. 修改ODBC连接字符串参数
Office 365的Access ODBC驱动存在并发检测逻辑bug,添加特定参数可绕过该问题:
将原有连接字符串调整为:
conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\path\to\your\database.accdb;Mode=ReadWrite;ExtendedAnsiSQL=1;LockingMode=1;'
参数说明:
ExtendedAnsiSQL=1:启用ANSI SQL兼容模式,修正跨表操作的驱动行为LockingMode=1:强制使用记录级锁定,避免驱动误判页面级锁定的冲突
2. 拆分跨表更新操作
避免直接在UPDATE语句中关联MySQL链接表,改为分步操作:
- 先将需要的链接表数据导入Access本地临时表:
SELECT [需要的字段] INTO #LocalTemp FROM MySQLLinkedTable WHERE [筛选条件];
- 使用本地临时表更新目标表:
UPDATE LocalTargetTable INNER JOIN #LocalTemp ON LocalTargetTable.ID = #LocalTemp.ID SET LocalTargetTable.Field1 = #LocalTemp.Field1, LocalTargetTable.Field2 = #LocalTemp.Field2;
- 清理临时表:
DROP TABLE #LocalTemp;
原理:将跨数据源的关联操作转为本地表操作,避开驱动对跨源更新的错误冲突检测。
3. 替换为ACE OLEDB驱动连接
放弃Access ODBC驱动,改用ACE OLEDB驱动通过pyodbc连接,该驱动的跨表更新逻辑更稳定:
conn_str = ( r'Provider=Microsoft.ACE.OLEDB.12.0;' r'Data Source=C:\path\to\your\database.accdb;' r'Persist Security Info=False;' ) conn = pyodbc.connect(conn_str)
注意:确保已安装对应版本的ACE OLEDB驱动(32/64位需与Python环境匹配)。
4. 调整Access数据库锁定设置
在Access客户端中修改数据库的默认锁定配置:
- 打开目标Access数据库
- 点击「文件」->「选项」->「客户端设置」
- 在「高级」区域,将「默认锁定方式」改为「记录锁定」,关闭「打开时独占」
- 保存数据库后重新通过pyodbc连接
原理:优化数据库的锁定策略,减少驱动误判冲突的概率。
内容的提问来源于stack exchange,提问作者Julio Silva
相关产品推荐
相关产品推荐

