2012-04-12 11 views
12

Ich habe keine Ahnung, warum ich diesen Fehler bekomme und kann keine Lösungen dafür finden. Ich kann eine Verbindung zu einer SQL Server-Datenbank mit Freetds Tsql herstellen, aber ich bekomme immer einen Fehler beim Verbinden mit pymssql.connect.Kann keine Verbindung zu SQL Server-Datenbank mit Pymssql herstellen, aber Verbindung mit zugrunde liegenden Freetds tsql

Der genaue Fehler ist:

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")

Ich habe die Konfiguration für freetds gesetzt, wie:

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

Lauf:

tsql -S custom_config -U tsmv -P xxx 

kehrt:

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

, die mir ermöglicht, die Datenbank abzufragen.

jedoch läuft:

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

wirft den obigen Fehler.

Ich benutze Linux CentOS, Python 2.6.6, Freetds 0.92 dev (Ich habe andere Versionen mit Tdsver = 7.0 kompilieren versucht).

Das freetds log ist:

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) 

ich völlig verloren bin, warum dies nicht funktioniert. Jede Hilfe würde sehr geschätzt werden.

+0

Sie möchten möglicherweise Servername anstelle von Server verwenden. Außerdem stieß ich auf Probleme (zumindest mit pyodbc), wo eine Verbindungszeichenfolge sich nicht genau so zu verhalten schien wie das Übergeben von Kwargs (vielleicht ist das aber mein Fehler ...). Sie könnten auch versuchen, pyodbc anstelle von pymssql zu verwenden (keine Erfahrung mit pymssql hier). –

+0

Danke Derek, ich habe deinen Ratschlag angenommen, bin von der Verwendung von Pymssql befreit und habe begonnen, pyodbc mit dem Linux-Treiber von Microsoft zu verwenden. Alles funktioniert jetzt gut (obwohl ich weiß, dass dies meine ursprüngliche Frage nicht beantwortet). – chewynougat

Antwort

6

Die "Adaptive Server Verbindung fehlgeschlagen" scheint eine ziemlich allgemeine Nachricht zu sein, aber hier sind einige Dinge zu versuchen.

  1. Diese Mailingliste Thread (http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html) sagt, dass in einen der falschen TDS-Protokoll Ergebnisse mit Meldung "Adaptive Server-Verbindung fehlgeschlagen". Das scheint in Chewynougats Logbuch nicht der Fall zu sein, aber vielleicht hilft es anderen.

  2. Diese FAQ gibt viele Schritte, um zu versuchen: https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,

Man versucht, die tds Verbindung über Tsql -H zu testen, die von der Conf-Bypässe zu lesen und liest nur in der übergebenen in Werten. Da das obige conf sowohl die Port- als auch die Protokollversion enthält, könnte es sinnvoll sein, dies zusammen mit tsql -C zu überprüfen, um festzustellen, ob Anpassungen erforderlich sind.

  1. Auch am unteren Ende der FAQ heißt es, dass

    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. Im selben Abschnitt spricht über unterschiedliche Zeichensätze das mssql.connect verderben, also vielleicht auch ein einfaches Passwort (zB ASCII 65-90) versuchen, um sicherzustellen, dass nichts in der Übersetzung verloren geht. Es sieht so aus, als ob Aki mit Japanisch arbeitet, vielleicht ist das auch ein Grund.
2

Ich konfrontiert das gleiche Problem.Glücklicherweise habe ich herausgefunden, was falsch ist. Ich hatte zwei verschiedene Versionen von FreeTDS auf meinem Rechner. Ich installierte eine von ihnen (v 0.91) von:

sudo apt-get install freetds-dev 

später fand ich heraus, es ist nicht die letzte Version und ich heruntergeladen die TAR-Datei von freetds von freetds.org. Als ich tsql -C lief. es zeigte den richtigen Pfad und ich manipulierte diese freetds.conf korrekt. Mit wechselnder Umgebungsvariable (http://www.freetds.org/userguide/envvar.htm) könnte ich eine Verbindung zur Datenbank herstellen. Jedes Mal, wenn ich versuchte, mich mit Pymssql zu verbinden, bekam ich einen Fehler.

Schließlich habe ich mir die Log-Datei angesehen und herausgefunden, dass Python die alte Version (v 0,91) verwendet, aber meine letzte war Version 0,95.

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

Also löschte ich die Version 0.91 mit:

sudo apt-get purge freetds-common 

und pymssql mit korrekter Konfiguration in die richtige Version verbunden.

Es kann Ihnen auch helfen.