SQLAlchemy无法连接Access DSN的故障排查求助
Windows致命异常0xc0000138:读取MS Access数据库表失败排查
问题场景
每日运行的Python脚本突然失效,定位到以下代码触发Windows致命异常(错误码0xc0000138):
import pandas as pd df_date = pd.read_sql_table('DIM Date','access+pyodbc://MyDSN')
使用的是64位MS Access数据源(MyDSN),已尝试以下操作但未解决:
- 从第三方网站下载缺失DLL并注册
- 新建64位Python3.10.8的conda环境,安装依赖:
conda create --name bound2 conda activate bound2 conda install spyder pandas sqlalchemy pip pip install sqlalchemy-access
错误栈分析
从错误栈可以看到,异常发生在sqlalchemy_access调用win32com.client.Dispatch获取表主键约束的环节,错误码0xc0000138的核心原因是找不到指定DLL文件或DLL与当前环境(32/64位)不兼容。
排查与解决方案
1. 修复/重装官方Access驱动
- 不要使用第三方DLL,直接安装64位Microsoft Access Database Engine:
- 若系统安装了32位Office,需使用静默安装命令避免冲突:
AccessDatabaseEngine_X64.exe /quiet - 安装完成后重启系统,重新测试连接
- 若系统安装了32位Office,需使用静默安装命令避免冲突:
2. 验证ODBC数据源配置
- 打开64位ODBC管理器(
C:\Windows\System32\odbcad32.exe):- 检查MyDSN指向的Access文件路径是否正确,文件未被锁定、损坏或移动
- 点击「测试连接」确认数据源能正常访问数据库
3. 绕过SQLAlchemy表反射逻辑
pd.read_sql_table会触发表结构反射,而sqlalchemy-access的反射依赖Access COM对象,容易出问题。改用pd.read_sql_query直接查询,避免反射:
import pandas as pd import pyodbc # 直接用pyodbc连接,跳过sqlalchemy-access conn = pyodbc.connect('DSN=MyDSN') df_date = pd.read_sql_query('SELECT * FROM [DIM Date]', conn) conn.close()
4. 修复pywin32组件
conda环境中的pywin32(win32com依赖)可能版本不兼容,重装并注册:
pip uninstall -y pywin32 pip install pywin32==227 python -m pywin32.postinstall -install
5. 排查系统更新影响
脚本一周前突然失效,大概率是Windows/Office更新导致驱动损坏:
- 打开「设置-更新和安全-查看更新历史记录」,回滚最近一周的可疑更新
- 测试脚本是否恢复正常
内容的提问来源于stack exchange,提问作者hindzeit
相关产品推荐
相关产品推荐

