DB-Lib error message 20017 pymssql能连 MSSQLSERVER 2000但不能连2008 顽固的 DB-Lib error message 20017的快解

TDS协议的版本

  • TDS 4.2 Sybase和微软:在Sybase/Microsoft分裂时使用的版本。

  • TDS 5.0 Sybase:为Sybase引入的。因为TDS 5.0包括协商功能,通过它可以扩展协议功能,我们不太可能看到Sybase的新TDS版本。

  • TDS 7.0 微软:为SQL Server 7.0引入的。包括对SQL Server 7.0中的扩展数据类型的支持(如超过255个字符的char/varchar字段)。它还包括对Unicode的支持。

  • TDS 7.1: Microsoft,原为8.0。 为SQL Server 2000引入。包括对大整数(64位int)和 "变体 "数据类型的支持。

  • TDS 7.2 Microsoft, 原为 9.0,为SQL Server 2005引入。包括对varchar(max), varbinary(max), xml数据类型和MARS的支持。

  • TDS 7.3:Microsoft, 为SQL Server 2008引入的。包括支持扩展日期/时间,表作为参数。

  • TDS 7.4:Microsoft, 为SQL Server 2012引入的。包括对会话恢复的支持。


正常运行后, 中途手工关闭服务器, 得到的错误是 20047
pymssql._mssql.MSSQLDatabaseException: (20047, b'DB-Lib error message 20047, severity 9:\nDBPROCESS is dead or not enabled\n')

服务器没开, 找不到服务器或者服务器的路由, 得到的错误是 20009
pymssql._mssql.MSSQLDatabaseException: (20009, b'DB-Lib error message 20009, severity 9:\nUnable to connect: Adaptive Server is unavailable or does not exist (10.150.xxx.xxx)\n Net-Lib error during No route to host (113)\n')


最后,还是考虑TDS协议的版本问题。

TDS 4.2/5.0/7.0 还没有尝试。
尽管 TDS 7.4/7.3/7.2/7.1 都试过了。

再试几次吧。
mssql2k0=pymssql.connect(host="10.xxx.yyy.zzz",user="sa",password="your_pwd", database="mwx_char", as_dict=True, tds_version="7.0")

mssql2k0=pymssql.connect(host="10.xxx.yyy.zzz",user="sa",password="your_pwd", database="mwx_char", as_dict=True, tds_version="5.0")

mssql2k0=pymssql.connect(host="10.xxx.yyy.zzz",user="sa",password="your_pwd", database="mwx_char", as_dict=True, tds_version="4.2")


ENTER 刚按下, 熟悉的连接画面出现了。
隧道的尽头的光终于出现了。

是的, MSSQLSERVER 2008 和 MSSQLSERVER 2012 您要用 tds_version="7.0"。
不是 tds_version= 7.0 , 而是 tds_version="7.0",
也不是 tds_version="10.0",tds_version="9.0",tds_version="8.0",tds_version="7.3", tds_version="7.2",tds_version="7.1"。


重要的来说, 连接2008R2 以上的, 都必须要加上TDS的版本号, 如下图: 


tds_version="7.0"



# 连接参数
server = 'xxx'
port = 'xxx'
database = 'xxx'
username = 'xx'
password = 'xxx'

# 建立连接
conn = pymssql.connect(server=server, database=database, user=username, password=password, port=port,tds_version="7.0")

# 创建游标对象
cursor = conn.cursor()


白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论