2010-06-29 19 views
7

Używam następujący zestaw oprogramowania na Ubuntu 10.04 LTS Lucid do połączyć się z bazą danych:sql server error natywna funkcja parametr wiążą

  1. Python 2.6.5 (pakiet ubuntu)
  2. pyodbc git bagażnika popełnić eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (pakiet ubuntu)
  4. freetds 0,82 (pakiet ubuntu)
  5. systemu Windows z Microsoft SQL Server 2000 (8,0)

otrzymuję ten błąd, gdy próbuje zrobić natywną parametr wiąże w argumentach do funkcji 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)') 

Oto kod reprodukcji:

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

Teraz funkcja jest tworzony. Gdy próbuję to nazwać używając wartości bezpośrednio w zapytaniu (brak rodzimych wiąże się z wartościami), to działa dobrze:

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

Jednakże pojawia się błąd powyżej, gdy próbuję zrobić natywną bind (za pomocą parametru zastępczy i przechodzącej wartość oddzielnie):

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

Dalsze dochodzenie ujawnia niektóre dziwne rzeczy chciałbym odnosić się:

  • Wszystko działa poprawnie, jeśli cha nge TDS w wersji 4.2 (jednak raport o wersji z serwera sql jest nieprawidłowy - przy użyciu wersji TDS 4.2 Otrzymuję '95.08.0255' zamiast prawdziwej wersji '08.00.0760').
  • Wszystko działa poprawnie dla pozostałych dwóch typów funkcji -> funkcje, które zwracają wartość i funkcje, które są tylko SELECT zapytanie (jak widok), oba działają dobrze. Można nawet zdefiniować nową funkcję , która zwraca wynik zapytania z drugiej (zepsutej) funkcji, i w ten sposób wszystko zadziała, , nawet jeśli wykonuje natywne wiązania na parametrach. Na przykład: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
  • Połączenie staje się bardzo niestabilne po tym błędzie, nie można odzyskać.
  • Błąd występuje podczas próby powiązania dowolnego typu danych.

Jak mogę kontynuować to dalej? Chciałbym wykonać macierzyste powiązania z parametrami funkcji.

+0

Proces 54 wygenerowany wyjątek krytyczny c0000005 EXCEPTION_ACCESS_VIOLATION: Ty lepiej skontaktować się z obsługą produktu. Najpierw zgłoś to na https://connect.microsoft.com/SQLServer, upewnij się, że załączasz plik .mdmp z folderu LOG ​​serwera. Zespół produktu może odpowiedzieć na to obejście. –

+0

Och, brakowało mi SQL 2k –

+1

@Remus Rusanu: Podstawowa obsługa SQL SERVER 2000 zakończyła się dawno temu. Wydaje się, że rozszerzona pomoc nie obejmie tego problemu. Też nie myślę, że Microsoft pomaga podczas korzystania z sterownika odbc freetds. – nosklo

Odpowiedz

0

Ostatecznie to prawdopodobnie nie jest odpowiedź, której szukasz, ale kiedy musiałem połączyć się z MSSQL od Perla dwa lub trzy lata temu, ODBC + FreeTDS był początkowo zaangażowany, a ja nie dostałem nigdzie z to (chociaż nie pamiętam konkretnych błędów, próbowałem zrobić coś wiążącego i wydawało mi się, że jest źródłem niektórych problemów).

W projekcie Perl ostatecznie zakończyłem pracę, używając sterownika przeznaczonego dla Sybase (z którego rozwidla się MSSQL), więc warto się nad tym zastanowić.

Python Wiki ma stronę na inny temat Sybase i SQL Server, które prawdopodobnie będziesz chciał do zapoznania alternatyw:

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

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

Powiązane problemy