Ruby使用TinyTds连接远程SQL Server 2014报错求助
解决Ruby tiny_tds连接远程SQL Server 2014失败问题
以下是针对你遇到的连接问题的排查和解决步骤:
1. 匹配SQL Server 2014对应的TDS版本
SQL Server 2014适配的TDS版本是7.2,而你的freetds编译默认使用7.3,版本不匹配可能导致兼容性问题。可以通过两种方式修正:
- 代码中显式指定TDS版本:
require 'tiny_tds' client = TinyTds::Client.new(host: '172.xx.0.xxx', database: 'XXXXxxxxxTEST', username: 'sa', password: 'Xnforxxxx', tds_version: '7.2') results = client.execute("SELECT * FROM XXX_ProcessOrder")
- 修改freetds.conf配置文件:
在/usr/local/etc/freetds.conf中添加目标服务器的配置条目:
[remote-sql-2014] host = 172.xx.0.xxx port = 1433 tds version = 7.2
之后代码中改用dataserver参数调用:
client = TinyTds::Client.new(dataserver: 'remote-sql-2014', database: 'XXXXxxxxxTEST', username: 'sa', password: 'Xnforxxxx')
2. 显式指定SQL Server端口
UI客户端可能默认使用1433端口,但远程服务器可能修改了端口,或网络存在端口映射问题。在连接参数中添加端口:
client = TinyTds::Client.new(host: '172.xx.0.xxx', port: 1433, # 替换为实际端口 database: 'XXXXxxxxxTEST', username: 'sa', password: 'Xnforxxxx', tds_version: '7.2')
3. 用tsql命令验证freetds底层连通性
先跳过tiny_tds,直接用freetds自带的tsql工具测试远程连接,确认问题是否出在freetds层面:
tsql -H 172.xx.0.xxx -p 1433 -U sa -P Xnforxxxx -D XXXXXxxxxxTEST
如果该命令也无法连接,需排查:
- 远程服务器防火墙是否允许你的本地IP访问SQL Server端口
- 远程SQL Server是否开启了TCP/IP协议(通过SQL Server配置管理器确认)
sa账号是否被允许远程登录(在SQL Server管理工具中查看账号属性)
4. 禁用MARS(多活动结果集)
你的freetds编译时开启了MARS,但SQL Server 2014对MARS的兼容性可能存在问题。尝试在连接参数中关闭MARS:
client = TinyTds::Client.new(host: '172.xx.0.xxx', database: 'XXXXxxxxxTEST', username: 'sa', password: 'Xnforxxxx', tds_version: '7.2', mars: false)
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

