2012-04-12 41 views
12

Tôi không biết tại sao tôi gặp lỗi này và không thể tìm thấy giải pháp nào cho nó. Tôi có thể kết nối với cơ sở dữ liệu SQL Server bằng cách sử dụng freetds tsql nhưng tôi vẫn gặp lỗi khi kết nối bằng cách sử dụng pymssql.connect.Không thể kết nối với cơ sở dữ liệu SQL Server bằng pymssql nhưng có thể kết nối bằng cách sử dụng freetds tsql cơ bản

Các lỗi cụ thể là:

pymssql.OperationalError: (18456, "Login failed for user 'xxx'.DB-Lib error message 18456, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n")

Tôi đã cấu hình thiết lập cho freetds như:

[custom_config] 
    host = myhost 
    port = 1433 
    tds version = 7.0 
    encryption = request 
    dump file = /tmp/freetds.log 

chạy:

tsql -S custom_config -U tsmv -P xxx 

lợi nhuận:

locale is "en_US.UTF-8" 
locale charset is "UTF-8" 
using default charset "UTF-8" 
1> 

cho phép tôi truy vấn cơ sở dữ liệu.

Tuy nhiên, chạy:

python 
>> import pymssql 
>> pymssql.connect(server='custom_config', user='user', password='xxx', database='database') 

làm tăng lỗi trên.

Tôi đang sử dụng CentOS Linux, python 2.6.6, freetds 0.92 dev (Tôi đã thử các phiên bản khác biên dịch với tdsver = 7.0).

Nhật ký freetds là:

log.c:196:Starting log file for FreeTDS 0.92 
on 2012-04-12 10:39:15 with debug flags 0x4fff. 
iconv.c:330:tds_iconv_open(0x1391b70, ISO-8859-1) 
iconv.c:187:local name for ISO-8859-1 is ISO-8859-1 
iconv.c:187:local name for UTF-8 is UTF-8 
iconv.c:187:local name for UCS-2LE is UCS-2LE 
iconv.c:187:local name for UCS-2BE is UCS-2BE 
iconv.c:349:setting up conversions for client charset "ISO-8859-1" 
iconv.c:351:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion 
iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion 
iconv.c:394:tds_iconv_open: done 
net.c:205:Connecting to xx.x.x.xxx port 1433 (TDS version 7.1) 
net.c:270:tds_open_socket: connect(2) returned "Operation now in progress" 
net.c:310:tds_open_socket() succeeded 
util.c:156:Changed query state from DEAD to IDLE 
net.c:741:Sending packet 
0000 12 01 00 34 00 00 00 00-00 00 15 00 06 01 00 1b |...4.... ........| 
0010 00 01 02 00 1c 00 0c 03-00 28 00 04 ff 08 00 01 |........ .(......| 
0020 55 00 00 02 4d 53 53 51-4c 53 65 72 76 65 72 00 |U...MSSQ LServer.| 
0030 c7 39 00 00   -      |.9..| 

net.c:555:Received header 
0000 04 01 00 25 00 00 01 00-      |...%....| 

net.c:609:Received packet 
0000 04 01 00 25 00 00 01 00-00 00 15 00 06 01 00 1b |...%.... ........| 
0010 00 01 02 00 1c 00 01 03-00 1d 00 00 ff 0a 00 0f |........ ........| 
0020 a0 00 00 02 00   -      |.....| 

login.c:1057:detected flag 2 
login.c:782:quietly sending TDS 7+ login packet 
token.c:328:tds_process_login_tokens() 
net.c:555:Received header 
0000 04 01 00 72 00 51 01 00-      |...r.Q..| 

net.c:609:Received packet 
0000 04 01 00 72 00 51 01 00-aa 5e 00 18 48 00 00 01 |...r.Q.. .^..H...| 
0010 0e 1d 00 4c 00 6f 00 67-00 69 00 6e 00 20 00 66 |...L.o.g .i.n. .f| 
0020 00 61 00 69 00 6c 00 65-00 64 00 20 00 66 00 6f |.a.i.l.e .d. .f.o| 
0030 00 72 00 20 00 75 00 73-00 65 00 72 00 20 00 27 |.r. .u.s .e.r. .'| 
0040 00 74 00 73 00 6d 00 76-00 27 00 2e 00 0c 4d 00 |.t.s.m.v .'....M.| 
0050 43 00 53 00 2d 00 44 00-41 00 54 00 41 00 42 00 |C.S.-.D. A.T.A.B.| 
0060 41 00 53 00 45 00 00 01-00 fd 02 00 00 00 00 00 |A.S.E... ........| 
0070 00 00     -      |..| 

token.c:337:looking for login token, got aa(ERROR) 
token.c:122:tds_process_default_tokens() marker is aa(ERROR) 
token.c:2588:tds_process_msg() reading message 18456 from server 
token.c:2661:tds_process_msg() calling client msg handler 
dbutil.c:85:_dblib_handle_info_message(0x14e2e30, 0x1391b70, 0x7fff8b047e40) 
dbutil.c:86:msgno 18456: "Login failed for user 'xxx'." 
token.c:2674:tds_process_msg() returning TDS_SUCCEED 
token.c:337:looking for login token, got fd(DONE) 
token.c:122:tds_process_default_tokens() marker is fd(DONE) 
token.c:2339:tds_process_end: more_results = 0 
    was_cancelled = 0 
    error = 1 
    done_count_valid = 0 
token.c:2355:tds_process_end() state set to TDS_IDLE 
token.c:2370:    rows_affected = 0 
token.c:438:tds_process_login_tokens() returning TDS_FAIL 
login.c:466:login packet accepted 
util.c:156:Changed query state from IDLE to DEAD 
util.c:331:tdserror(0x14e2e30, 0x1391b70, 20002, 0) 
dblib.c:7929:dbperror(0x1383c70, 20002, 0) 
dblib.c:7981:20002: "Adaptive Server connection failed" 
dblib.c:8002:"Adaptive Server connection failed", client returns 2 (INT_CANCEL) 
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) 
util.c:384:tdserror: returning TDS_INT_CANCEL(2) 
dblib.c:1443:dbclose(0x1383c70) 
dblib.c:258:dblib_del_connection(0x7fa462faf540, 0x1391b70) 
mem.c:615:tds_free_all_results() 
dblib.c:305:dblib_release_tds_ctx(1) 
dblib.c:5882:dbfreebuf(0x1383c70) 
dblib.c:739:dbloginfree(0x1533a40) 

Tôi hoàn toàn bị mất là tại sao điều này không làm việc. Bất kì sự trợ giúp nào đều được đánh giá cao.

+0

Bạn có thể muốn sử dụng tên máy chủ thay vì máy chủ. Ngoài ra, tôi chạy vào các vấn đề (ít nhất là với pyodbc), nơi một chuỗi kết nối dường như không hành xử chính xác giống như đi qua kwargs (có thể là sai lầm của tôi mặc dù ...). Bạn cũng có thể thử sử dụng pyodbc thay vì pymssql (không có kinh nghiệm với pymssql ở đây). –

+0

Cảm ơn Derek, tôi đã đưa ra lời khuyên của bạn, được gửi đi từ việc sử dụng pymssql và bắt đầu sử dụng pyodbc với trình điều khiển Linux của Microsoft. Tất cả các công trình tốt bây giờ (mặc dù tôi biết điều này không trả lời câu hỏi ban đầu của tôi). – chewynougat

Trả lời

6

"Kết nối máy chủ thích ứng không thành công" có vẻ là một thông điệp khá chung chung, nhưng đây là một số điều cần thử.

  1. Chuỗi danh sách gửi thư này (http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html) nói rằng kết quả giao thức TDS không đúng trong thông báo "Kết nối máy chủ không thích ứng". Điều đó dường như không phải là trường hợp trong nhật ký của chewynougat, nhưng có lẽ nó giúp ích cho người khác.

  2. FAQ Điều này cho phép nhiều bước thử: https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,

Một đang nỗ lực để kiểm tra kết nối tds qua -H TSQL, mà bỏ qua việc đọc từ conf và chỉ đọc trong thông qua trong các giá trị. Cho rằng conf ở trên chứa cả phiên bản cổng và giao thức, nó có thể đáng giá để kiểm tra rằng cùng với tsql -C để xem liệu có cần điều chỉnh hay không.

  1. Ngoài ra, ở dưới cùng của FAQ, nó khẳng định rằng

    real "Login incorrect" messages has code=18456 and severity=14

That is the error message being sent, so perhaps try Login Auditing ( http://msdn.microsoft.com/en-us/library/ms175850.aspx) to see if pymssql is passing your credentials in properly.

  1. Đó phần cuộc đàm phán như vậy về bộ ký tự khác nhau làm rối loạn các mssql.connect, vì vậy cũng có thể thử một mật khẩu cơ bản (ví dụ, ASCII 65-90) để đảm bảo rằng không có gì bị mất trong bản dịch. Có vẻ như Aki làm việc với người Nhật, nên có lẽ đây cũng là một nguyên nhân.
2

Tôi cũng gặp phải vấn đề tương tự.May mắn thay, tôi phát hiện ra những gì là sai. Tôi đã có hai phiên bản khác nhau của FreeTDS trên máy tính của tôi. Tôi đã cài đặt một trong số chúng (v 0.91) bởi:

sudo apt-get install freetds-dev 

sau đó tôi phát hiện ra đây không phải là phiên bản cuối cùng và tôi đã tải xuống tệp tar của Freetds từ freetds.org. Khi tôi chạy tsql -C. nó cho thấy đường dẫn chính xác và tôi đã thao tác freetds.conf đó một cách chính xác. Với biến môi trường thay đổi (http://www.freetds.org/userguide/envvar.htm), tôi có thể kết nối với cơ sở dữ liệu. Tuy nhiên, mỗi lần tôi cố gắng kết nối bằng Pymssql tôi gặp lỗi.

Cuối cùng, tôi đã xem tệp nhật ký và tôi đã tìm ra rằng Python đang sử dụng phiên bản cũ (v 0.91) nhưng phiên bản cuối cùng của tôi là phiên bản 0.95.

>>> import os 
>>> os.environ['TDSDUMP'] = 'stdout' 
>>> 
>>> import pymssql 
>>> conn = pymssql.connect(server="sqlserverhost") 

Vì vậy, tôi đã xóa phiên bản 0,91 với:

sudo apt-get purge freetds-common 

và pymssql kết nối với phiên bản đúng với cấu hình chính xác.

Nó cũng có thể giúp bạn.

Các vấn đề liên quan