在 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,因此似乎沒有一般的連接問題。
所以,此刻,我已經死在了水里。任何有關診斷這些錯誤消息或建議其他嘗試的幫助將不勝感激。
我最終按照此處的說明進行操作,現在一切正常:
http://kipb7.wordpress.com/2008/06/12/pyodbc-unixodbc-freetds-config/
出現“DB-Lib 錯誤消息 20004,嚴重性 9:從 SQL 伺服器讀取失敗”錯誤。
在 Linux/*nix 上,您可能會遇到以下行為: import _mssql c=_mssql.connect(‘hostname:portnumber’,‘user’,‘pass’) Traceback (most recent call last): File “”, line 1, in _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