Qt 5.15.2通过ODBC驱动操作Access数据库突然无法新增列故障求助
解决方案
核心问题根因
报错本质是执行ALTER TABLE修改表结构时,Access要求独占访问目标表,但此时表上存在未释放的共享锁,从你描述的场景来看,锁大概率来自你自己进程内的前置操作,而非第三方进程。
可落地修复步骤
- 调整字段检查逻辑,避免提前持有表锁
你当前使用的kkp::DaoFindField以及td.Open("Adressen")都会内部打开Adressen表的句柄,即便调用了Close方法,ODBC驱动层面的共享锁也可能存在延迟释放的情况。可以替换字段存在性校验逻辑:直接查询Access系统表MSysColumns判断字段是否存在,全程不需要打开目标表,从根源避免提前加锁。 - 打开数据库时强制指定独占模式
修改openDatabase的连接参数,ODBC连接字符串新增Exclusive=1参数,确保修改表结构阶段你的进程独占数据库访问权限,修改完成后如果需要支持多进程访问,可以关闭独占连接再重新用共享模式打开。 - 清理未释放的连接资源
执行ALTER TABLE语句前,显式关闭所有已经创建的针对Adressen表的QSqlQuery、CDaoTableDef实例,提交所有未提交的事务,避免残留的事务持有表锁。 - 排查文件锁残留
找到mdb文件同级目录下的.laccdb或者.ldb临时锁文件,关闭所有可能访问mdb的进程后删除该锁文件,再重新运行程序测试。 - 规避调试器影响
调试模式下断点停留时,未释放的数据库连接会持续持有锁,可以直接运行Release版本的可执行文件复现测试,排除调试器干扰。
内容的提问来源于stack exchange,提问作者Der Achim
相关产品推荐
相关产品推荐

