2010-06-29 52 views
7

J'utilise la pile de logiciels suivants sur Ubuntu 10.04 Lucid LTS à se connecter à une base de données:fonction de serveur SQL erreur de liaison de paramètre native

  1. python 2.6.5 (paquet ubuntu)
  2. pyodbc tronc git engager eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (paquet ubuntu)
  4. freetds 0,82 (paquet ubuntu)
  5. Windows avec Microsoft SQL Server 2000 (8.0)

je reçois cette erreur lorsque vous essayez de faire le paramètre natif se fixe dans les arguments à une fonction SQL SERVER:

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

est ici le code de reproduction:

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

Maintenant, la fonction est créée. Si je tente d'appeler à l'aide d'une valeur directe dans la requête (aucun binds natif de valeurs), il fonctionne très bien:

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

Cependant, je reçois l'erreur ci-dessus lorsque je tente de faire une liaison native (en utilisant un paramètre espace réservé et passer la valeur séparément):

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

enquête approfondie révèle une bizarre choses Je voudrais raconter:

  • Tout fonctionne bien si je cha nge TDS Version à 4.2 (cependant, version rapport du serveur sql est faux - en utilisant TDS version 4.2 je reçois '95.08.0255' au lieu de la version réelle '08.00.0760').
  • Tout fonctionne bien pour les deux autres types de fonctions -> fonctions qui renvoient une valeur et les fonctions qui sont juste une requête SELECT (comme une vue) à la fois bien fonctionner. Vous pouvez même définir une nouvelle fonction qui renvoie le résultat d'une requête sur l'autre fonction (cassée), et de cette façon tout fonctionnera, même en faisant natif lie sur le paramètres. Par exemple: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
  • La connexion devient très instable après cette erreur, vous ne pouvez pas récupérer.
  • L'erreur se produit lorsque vous essayez de lier n'importe quel type de données.

Comment puis-je poursuivre plus loin? Je voudrais faire des liens natifs aux paramètres de la fonction.

+0

processus 54 a généré une exception fatale c0000005 EXCEPTION_ACCESS_VIOLATION: Vous mieux contacter le support produit. À tout le moins, signalez ceci sur https://connect.microsoft.com/SQLServer, assurez-vous de joindre le (s) fichier (s) .mdmp à partir du dossier LOG du serveur. L'équipe de produit peut répondre avec une solution de contournement. –

+0

Oh, j'ai manqué est SQL 2k –

+1

@Remus Rusanu: Support de base pour SQL Server 2000 a pris fin il ya longtemps. Il semble que le soutien étendu ne couvrira pas cela. Je ne pense pas non plus que Microsoft aide lors de l'utilisation du pilote freetds odbc. – nosklo

Répondre

0

En fin de compte, ce n'est probablement pas la réponse que vous cherchez, mais quand j'ai dû me connecter à MSSQL depuis Perl il y a deux ou trois ans, ODBC + FreeTDS était initialement impliqué, et je n'ai rien obtenu avec il (bien que je ne me souvienne pas des erreurs spécifiques, j'essayais de faire une liaison, cependant, et cela semblait être la source d'une partie du problème).

Sur le projet Perl, j'ai fini par utiliser un pilote destiné à Sybase (dont MSSQL est issu), vous devriez donc vous intéresser à cela.

Le wiki Python a une page sur Sybase et un autre sur le serveur SQL que vous aurez probablement envie de prendre connaissance des alternatives:

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

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