Linux下用nanodbc连接MSSQL遇‘Invalid attribute value’错误求助
针对你遇到的这个错误,结合你给出的/etc/odbcinst.ini配置,我整理了几个实用的排查和解决方向:
1. 先确认驱动文件路径是否有效
你配置里的两个驱动路径,先验证它们是否真的存在:
# 检查Driver 17的文件 ls -l /opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.1.so.0.1 # 检查Driver 13的文件 ls -l /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2
如果返回"文件不存在",说明驱动安装不完整或者路径写错了——要么重新安装对应版本的MSODBC驱动,要么修正odbcinst.ini里的Driver路径。
2. 排查Trace配置的权限问题
你开启了Trace=yes,还指定了TraceFile=/home/mercury/Desktop/tracefile.txt,这里很容易踩权限坑:如果运行nanodbc程序的用户(比如root或者其他服务用户)没有/home/mercury/Desktop目录的读写权限,驱动初始化时就会因为无法写入追踪文件抛出"Invalid attribute value"错误。
可以先临时关闭Trace测试:把odbcinst.ini里的Trace=no,然后重启程序。如果错误消失,就说明是Trace文件的权限问题——要么给运行用户添加该目录的读写权限,要么把Trace文件路径换到一个有权限的目录(比如/tmp/tracefile.txt)。
3. 用isql验证驱动本身是否可用
先抛开nanodbc,用系统自带的isql工具测试ODBC驱动能不能正常连接:
# 测试Driver 17,替换成你的服务器地址、用户名和密码 isql -v "ODBC Driver 17 for SQL Server" your_sql_server your_username your_password
如果isql也报错,说明是驱动本身的配置问题,和nanodbc无关,先解决驱动的基础连接问题;如果isql能正常连接,那问题大概率出在nanodbc的连接字符串上。
4. 检查nanodbc的连接字符串
确保你的nanodbc连接字符串里的驱动名称和odbcinst.ini里的完全一致,比如应该是:
// 示例连接字符串,注意驱动名称的大小写和空格要完全匹配 std::string conn_str = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=your_server;UID=your_user;PWD=your_pass;";
另外,有些旧属性在高版本驱动里可能不兼容,如果你的连接字符串里用了Driver 17不支持的属性,也会触发"Invalid attribute value"错误,建议对应驱动版本的属性列表调整。
内容的提问来源于stack exchange,提问作者nemo

