You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc通过DSN连接SQL Server时遇SQLAllocHandle错误求助

问题:pyodbc连接SQL Server时出现IM004错误

代码片段

import pyodbc

pyodbc.autocommit = True

conn = pyodbc.connect('DSN=SQLSERVER_CONN')
cursor = conn.cursor()
cursor.execute('select count(1) from jupiter.fact_load')
result = cursor.fetchall()

for row in result:
   print(row)

cursor.close()
conn.close()

.odbc.ini配置

[SQLSERVER_CONN]
Description=Connection to SQLSERVER UAT
DRIVER=/home/aiman/mssql-jdbc/9.2.0/libmsodbcsql-11.0.so.2270.0
SERVER=my.sqlserver.com,10501
DATABASE=jupiter
UID=aiman
PWD=xxxxx
Trusted_Connection=yes

错误信息

Traceback (most recent call last):
  File "test_odbc.py", line 5, in <module>
    conn = pyodbc.connect('DSN=SQLSERVER_CONN')
pyodbc.Error: ('IM004', "[IM004] [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)")

解决办法

  • 调整rll文件目录结构:SQL Server ODBC驱动要求.rll文件放在驱动目录的对应locale子目录下。比如在/home/aiman/mssql-jdbc/9.2.0/下创建en-US文件夹,将msodbcsqlr11.rll移入该文件夹。unixODBC默认会在驱动目录的locale子目录加载资源文件,直接放在根目录无法识别。
  • 指定ODBC配置文件路径:运行脚本前设置环境变量,确保个人账号能正确读取.odbc.ini:
    export ODBCSYSINI=$HOME
    
    如果.odbc.ini不在home目录,替换为实际路径。
  • 移除冲突的认证配置:配置中同时存在UID/PWD和Trusted_Connection=yes,二者冲突。Linux环境下无Windows域支持,优先删除Trusted_Connection=yes这一行,使用账号密码认证。
  • 检查文件权限:确认驱动文件和.rll文件对个人账号有可读权限:
    ls -l /home/aiman/mssql-jdbc/9.2.0/
    
    若权限不足,执行chmod +r /home/aiman/mssql-jdbc/9.2.0/libmsodbcsql-11.0.so.2270.0 /home/aiman/mssql-jdbc/9.2.0/en-US/msodbcsqlr11.rll添加读权限。
  • 用isql测试连接:通过unixODBC自带的isql工具直接测试DSN连接,排除pyodbc层面的问题:
    isql SQLSERVER_CONN
    

内容的提问来源于stack exchange,提问作者aiman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 17:52:51