Ubuntu20.04下Qt应用无法连接Win7端MSSQL Server报错0x2746如何解决
问题根因
报错中的错误码0x2746对应TCP连接被对端重置,核心触发原因是:
- Microsoft ODBC Driver 18 for SQL Server 默认强制启用TLS加密连接,要求TLS 1.2及以上版本,且默认不信任服务端自签名证书
- 部署在Windows 7上的MSSQL Server通常默认未启用TLS 1.2、使用自生成SSL证书,部分低版本MSSQL甚至不支持高版本TLS协议
- DBeaver可正常连接是因为其自带的JDBC驱动默认采用宽松的加密校验策略,和ODBC驱动的默认安全策略不一致
排查解决步骤
第一步:修改连接字符串,添加加密相关参数
内网测试环境直接关闭强制加密、开启服务端证书信任,修改Qt代码中连接字符串拼接逻辑:// 原有连接字符串增加Encrypt和TrustServerCertificate参数 QString connectionString = QString("DRIVER={ODBC Driver 18 for SQL Server};Server=%1;Database=%2;Encrypt=No;TrustServerCertificate=Yes;").arg(ipName).arg(dbName);如果修改后仍连接失败,直接将账号密码写入连接字符串,去掉单独的
setUserName/setPassword调用,避免Qt传参兼容问题:QString connectionString = QString("DRIVER={ODBC Driver 18 for SQL Server};Server=%1;Database=%2;Uid=sa;Pwd=top123TOP;Encrypt=No;TrustServerCertificate=Yes;").arg(ipName).arg(dbName);第二步:脱离Qt验证ODBC驱动连通性
先在Ubuntu终端安装isql工具,直接通过ODBC驱动测试连接,排除Qt代码层问题:# 安装unixodbc工具包 sudo apt install unixodbc # 执行连接测试,替换参数为实际配置 isql -v "DRIVER={ODBC Driver 18 for SQL Server};Server=tcp:192.168.144.101,1433;Database=St***;Uid=sa;Pwd=top123TOP;Encrypt=No;TrustServerCertificate=Yes;"如果该命令能成功进入SQL交互提示符,说明ODBC驱动配置正常,问题出在Qt的QODBC插件加载或代码参数传递;如果命令返回连接失败,根据isql输出的详细报错定位驱动层问题。
第三步:校验驱动文件和依赖完整性
确认odbcinst.ini中配置的驱动so文件真实存在,执行以下命令检查:ls /opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.0.so.1.1如果提示文件不存在,说明ODBC驱动安装不完整,重新安装对应版本驱动即可;同时确认系统已安装Qt依赖的ODBC开发包:
sudo apt install unixodbc-dev第四步:兼容老版本TLS协议(前三步无效时操作)
Windows 7默认未启用TLS 1.2支持,且Ubuntu 20.04默认openssl配置禁用了TLS 1.0/1.1协议,如果MSSQL版本较旧仅支持TLS 1.0,可选择以下方案处理:- 给Windows 7系统安装对应补丁,启用MSSQL的TLS 1.2支持(生产环境推荐)
- 卸载Ubuntu上的ODBC Driver 18,改装ODBC Driver 17 for SQL Server,该版本对老TLS协议兼容性更好,默认加密策略更宽松
- 修改Ubuntu的openssl配置,放开TLS 1.0/1.1支持(仅测试环境临时使用,不推荐生产环境操作)
补充说明
当前提供的odbcinst.ini配置格式没有问题,只要驱动so路径正确即可正常加载,不需要额外调整配置项。
内容的提问来源于stack exchange,提问作者alexmaqess17
相关产品推荐
相关产品推荐

