2010-06-29 5 views
7

Ich bin in eine Datenbank des folgenden Software-Stack auf Ubuntu 10.04 Lucid LTS zu anschließen:SQL-Server-Funktion nativen Parameter binden Fehler

  1. Python 2.6.5 (ubuntu-Paket)
  2. Pyodbc git Stamm begehen eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (ubuntu-Paket)
  4. freetds 0,82 (ubuntu-Paket)
  5. Fenster mit Microsoft SQL Server 2000 (8.0)

Ich bekomme diese Fehlermeldung, wenn nativer Parameter zu tun versucht, bindet in Argumente zu einer SQL Server-Funktion:

Traceback (most recent call last): 
File "/home/nosklo/devel/testes/sqlfunc.py", line 32, in <module> 
    cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',)) 
pyodbc.ProgrammingError: ('42000', '[42000] [FreeTDS][SQL 
Server]SqlDumpExceptionHandler: Process 54 generated fatal exception 
c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this 
process.\r\n (0) (SQLPrepare)') 

Hier ist die Wiedergabe Code:

import pyodbc 
constring = 'server=myserver;uid=uid;pwd=pwd;database=db;TDS_Version=8.0;driver={FreeTDS}' 

con = pyodbc.connect(constring) 
print 'VERSION: ', con.getinfo(pyodbc.SQL_DBMS_VER) 

cur = con.cursor() 
try: 
    cur.execute('DROP FUNCTION fn_FuncTest') 
    con.commit() 
    print "Function dropped" 
except pyodbc.Error: 
    pass 

cur.execute(''' 
    CREATE FUNCTION fn_FuncTest (@testparam varchar(4)) 
    RETURNS @retTest TABLE (param varchar(4)) 
    AS 
    BEGIN 
     INSERT @retTest 
     SELECT @testparam 
     RETURN 
    END''') 
con.commit() 

Nun wird die Funktion erstellt wird. Wenn ich versuche, es zu nennen einen Wert direkt in der Abfrage (keine nativen bindet der Werte), es funktioniert:

cur.execute("SELECT * FROM fn_FuncTest('test')") 
assert cur.fetchone()[0] == 'test' 

Jedoch habe ich den Fehler oben, wenn ich versuche, eine native binden zu tun (durch einen Parameter verwenden Platzhalter und den Wert separat vorbei):

cur.execute("SELECT * FROM fn_FuncTest(?)", ('test',)) 

Weitere Untersuchungen haben einige seltsam Sachen enthüllt ich erzählen möchte:

  • Alles funktioniert gut, wenn ich cha nge TDS Version 4.2 (jedoch Version Bericht von SQL Server ist falsch - mit TDS Version 4.2 bekomme ich '95.08.0255' anstelle der realen Version '08.00.0760').
  • Alles funktioniert gut für die anderen beiden Arten von Funktionen -> Funktionen, die einen Wert zurückgeben und Funktionen, die nur eine SELECT Abfrage (wie eine Ansicht) funktionieren gut. Sie können sogar eine neue Funktion definieren, die das Ergebnis einer Abfrage für die andere (defekte) Funktion zurückgibt, und so funktioniert alles, , auch wenn native bindet auf die Parameter. Zum Beispiel: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
  • Verbindung wird nach diesem Fehler sehr instabil, Sie können nicht wiederherstellen.
  • Der Fehler tritt auf, wenn versucht wird, eine beliebige Art von Daten zu binden.

Wie kann ich das weiter verfolgen? Ich möchte native Bindungen zu Funktionsparametern machen.

+0

Prozess 54 schwerwiegende Ausnahme C0000005 EXCEPTION_ACCESS_VIOLATION erzeugt: Sie besserer Produkt-Support. Melden Sie dies zumindest auf https://connect.microsoft.com/SQLServer, und stellen Sie sicher, dass Sie die .mdmp-Datei (en) aus dem Ordner LOG des Servers anhängen. Das Produktteam kann mit einer Problemumgehung antworten. –

+0

Oh, verpasste ich SQL 2k –

+1

@Remus Rusanu: Basis-Unterstützung für SQL Server 2000 ist vor langer Zeit beendet. Es scheint, dass erweiterte Unterstützung dies nicht abdecken wird. Ich denke auch nicht, dass Microsoft hilft, wenn Freedds ODBC-Treiber verwendet. – nosklo

Antwort

0

Letztendlich ist dies wahrscheinlich nicht die Antwort, die Sie suchen, aber als ich vor zwei oder drei Jahren eine Verbindung zu MSSQL von Perl herstellen musste, war ODBC + FreeTDS zunächst involviert, und ich kam nicht weiter es (obwohl ich mich nicht an die spezifischen Fehler erinnere, versuchte ich jedoch, bindend zu sein, und es schien die Quelle einiger Probleme zu sein).

Beim Perl-Projekt habe ich schließlich einen Treiber für Sybase (von dem MSSQL abzweigte) verwendet, also sollten Sie sich das genauer ansehen.

Das Python-Wiki hat eine Seite auf Sybase und anderen auf SQL Server, die Sie wahrscheinlich für Alternativen prüfen werden wollen:

http://wiki.python.org/moin/Sybase

http://wiki.python.org/moin/SQL%20Server

Verwandte Themen