使用Python的pyodbc读取Access数据库遇无读取权限错误求助
问题:使用pyodbc连接Access数据库时遭遇读取权限错误
尝试用Python的pyodbc模块提取Microsoft Access数据库数据,代码如下:
import pyodbc conn_str = ( r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=directory_that_access_the_database;' r'DATABASE=name_of_the_database;' r'Trusted_Connection=yes;' ) cnxn = pyodbc.connect(conn_str) cursor = cnxn.cursor() cursor.execute('select * from database where database.date = #mm/dd/yyyy#') for row in cursor.fetchall(): print(row)
执行后返回错误:
('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Record(s) cannot be read; no read permission on database. (-1907) (SQLExecDirectW)")
已通过ribbon--Users和组权限功能为数据库开启权限,但错误仍存在,怀疑权限设置遗漏细节,寻求解决办法。
解决方案
修正文件系统级权限
Access数据库文件及其所在文件夹,需要当前运行Python的用户拥有读取和写入权限(Access运行时会生成临时文件,仅读权限可能引发异常)。操作步骤:- 右键数据库文件→属性→安全选项卡
- 点击"编辑",添加当前登录的Windows用户
- 勾选"读取和写入"权限,应用保存
优化连接字符串
Access的ODBC连接字符串不需要DATABASE和Trusted_Connection参数,冗余参数可能引发冲突,修正后的连接字符串示例:conn_str = ( r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};' r'DBQ=C:\path\to\your\database.accdb;' # 替换为实际文件路径 )修复SQL语句的关键字冲突
你的SQL中使用了database作为表名,这是SQL保留字,必须用方括号[]包裹,否则会引发语法或逻辑异常,修正后的查询:select * from [database] where [database].[date] = #mm/dd/yyyy#检查Access数据库内部安全细节
- 确保数据库未启用加密:打开数据库→文件→信息→解密数据库(如果显示加密状态)
- 确认数据库未设置为只读:右键文件→属性→取消勾选"只读"
- 检查用户权限时,确保为当前使用的Access用户(如果启用用户级安全)分配了对应表的读取数据权限,而非仅添加用户到组但未配置表权限
排除文件锁定问题
如果Access客户端正在打开该数据库,且处于独占模式,会导致外部连接无法读取数据。关闭Access客户端,或打开时选择"打开共享"模式
内容的提问来源于stack exchange,提问作者Yuuuu
相关产品推荐
相关产品推荐

