2010-06-29 7 views
7

Я использую следующий программный стек на Ubuntu 10.04 Lucid LTS для подключения к базе данных:функция SQL Server ошибка родной параметр привязки

  1. питон 2.6.5 (Ubuntu пакет)
  2. pyodbc магистральный мерзавец совершить eb545758079a743b2e809e2e219c8848bc6256b2
  3. UnixODBC 2.2.11 (Ubuntu пакет)
  4. FreeTDS 0,82 (убунту пакет)
  5. для Windows с Microsoft SQL Server 2000 (8,0)

Я получаю эту ошибку при попытке сделать нативный параметр связывает в качестве аргументов к функции 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)') 

Вот код репродукция:

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

Теперь функция создается. Если я пытаюсь вызвать его, используя значение прямого в запросе (не родной привязывают значения) она отлично работает:

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

Однако я получаю ошибку выше, когда я пытаюсь сделать нативную привязку (с помощью параметра заполнитель и передавая значение по отдельности):

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

Дальнейшее исследование показывает некоторые странно материал, который я хотел бы отнести:

  • Все отлично работает, если я тя nge TDS версии до 4.2 (однако версия отчета с сервера sql неверна - с использованием версии TDS 4.2 я получаю '95.08.0255' вместо реальной версии '08.00.0760').
  • Все работает отлично для двух других типов функций -> Функции, возвращающие значение и функции, которые являются просто запросом SELECT (как вид), отлично работают. Вы можете даже определить новую функцию , которая возвращает результат запроса с другой (сломанной) функции, и таким образом все будет работать, даже при выполнении нативных связей на параметрах . Например: CREATE FUNCTION fn_tempFunc(@testparam varchar(4)) RETURNS TABLE AS RETURN (SELECT * FROM fn_FuncTest(@testparam))
  • После этой ошибки соединение становится очень неустойчивым, вы не можете восстановить его.
  • Ошибка при попытке привязки любого типа данных.

Как я могу продолжить это? Я хотел бы сделать собственные привязки к параметрам функции.

+0

процесса 54 сгенерированного роковую исключение c0000005 EXCEPTION_ACCESS_VIOLATION: Вы лучше поддерживать контактную информацию. По крайней мере сообщите об этом на https://connect.microsoft.com/SQLServer, убедитесь, что вы прикрепляете файлы .mdmp из папки журнала сервера. Команда продукта может ответить обходным путем. –

+0

О, я пропустил SQL 2k –

+1

@Remus Rusanu: Базовая поддержка SQL SERVER 2000 закончилась давно. Похоже, что расширенная поддержка не будет охватывать это. Я также не думаю, что Microsoft помогает при использовании freetds odbc-драйвера. – nosklo

ответ

0

В конечном счете, это, вероятно, не тот ответ, который вы ищете, но когда мне приходилось подключаться к MSSQL с Perl два или три года назад, ODBC + FreeTDS изначально был задействован, и я никуда не сходил он (хотя я не помню конкретных ошибок, я пытался сделать привязку, хотя, и это казалось источником некоторых проблем).

В проекте Perl я в конечном итоге закончил работу с драйвером, предназначенным для Sybase (из которого MSSQL отключался), поэтому вам может понадобиться изучить это.

Питон вики имеет страницу на Sybase, а другой на SQL Server, который вы, вероятно, хотите, чтобы просмотреть альтернативы:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^