在 FreeBSD 上通过 FreeTDS 连接到 SQL Server 2005 时出现问题

在 FreeBSD 上通过 FreeTDS 连接到 SQL Server 2005 时出现问题

我正在尝试使用以下命令从 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。

參考文獻:http://pymssql.sourceforge.net/faq.php

答案2

我最终按照这里的说明进行操作,现在一切都运行正常:

http://kipb7.wordpress.com/2008/06/12/pyodbc-unixodbc-freetds-config/

相关内容