我正在尝试使用以下命令从 FreeBSD 服务器连接到 SQL Server 2005:
tsql -H DEV -p 1433 -U ****
这会导致以下错误消息:
locale is "C"
locale charset is "US-ASCII"
Password:
Msg 20004, Level 9, State 0, Server OpenClient, Line 0
Read from SQL server failed.
Msg 20014, Level 9, State 0, Server OpenClient, Line 0
Login incorrect.
There was a problem connecting to the server
由于错误消息报告“登录不正确”,我的第一步是验证我是否确实输入了正确的用户名和密码。这是一个 SQL Server 登录名(即不是 Windows 身份验证),我已确保输入正确且区分大小写。请注意,我能够使用相同的登录名从 Windows 客户端进行连接,没有任何问题。
我的下一步是从 FreeTDS 转储日志:
util.c:288:Starting log file for FreeTDS 0.64
on 2011-04-12 16:29:57 with debug flags 0x4fff.
iconv.c:195:names for ISO-8859-1: ISO-8859-1
iconv.c:195:names for UTF-8: UTF-8
iconv.c:195:names for UCS-2LE: UCS-2LE
iconv.c:195:names for UCS-2BE: UCS-2BE
iconv.c:361:iconv to convert client-side data to the "US-ASCII" character set
iconv.c:514:tds_iconv_info_init: converting "US-ASCII"->"UCS-2LE"
net.c:168:Connecting to 10.5.5.226 port 1433.
net.c:673:Sending packet
...snipped...
net.c:673:Sending packet
...snipped...
token.c:310:tds_process_login_tokens()
util.c:119:Changing query state from IDLE to DEAD
token.c:2252:tds_client_msg: #20004: "Read from SQL server failed.". Connection state is now 4.
token.c:314:looking for login token, got 0()
token.c:105:tds_process_default_tokens() marker is 0()
token.c:108:leaving tds_process_default_tokens() connection dead
util.c:119:Changing query state from DEAD to DEAD
token.c:2252:tds_client_msg: #20014: "Login incorrect.". Connection state is now 4.
mem.c:519:tds_free_all_results()
我验证的另一件事是 SQL Server 实例通过 TCP/IP 接受远程连接。我还可以从 FreeBSD 计算机通过端口 1433 远程登录到 SQL Server,因此似乎不存在一般的连接问题。
所以,目前,我束手无策。如果您能帮助诊断这些错误信息或建议尝试其他方法,我将不胜感激。
答案1
出现“DB-Lib 错误消息 20004,严重性 9:从 SQL 服务器读取失败”错误。
在 Linux/*nix 上,您可能会遇到以下行为: import _mssql c=_mssql.connect('hostname:portnumber','user','pass') Traceback (最近一次调用最后一次):文件“”,第 1 行,在 _mssql.DatabaseException 中:DB-Lib 错误消息 20004,严重性 9:从 SQL 服务器读取失败。DB-Lib 错误消息 20014,严重性 9:登录不正确。
当下列情况之一成立时,可能会发生这种情况:
- 找不到 freetds.conf 文件
- freetds.conf 文件中的 tds 版本不是 7.0 或 4.2
- 任何字符集都在 freetds.conf 中指定
- 无法识别的字符集被传递给 _mssql.connect() 或 pymssql.connect() 方法。
此错误后面的“登录不正确”是虚假的,真正的“登录不正确”消息的代码为 18456,严重性为 14。
答案2
我最终按照这里的说明进行操作,现在一切都运行正常:
http://kipb7.wordpress.com/2008/06/12/pyodbc-unixodbc-freetds-config/