функция SQL-сервера собственный параметр связывает ошибку

Я использую следующий программный стек на Ubuntu 10.04 Ясный LTS для соединения с базой данных:

  1. Python 2.6.5 (пакет человечности)
  2. мерзавец pyodbc соединяет фиксацию магистралью eb545758079a743b2e809e2e219c8848bc6256b2
  3. unixodbc 2.2.11 (пакет человечности)
  4. freetds 0.82 (пакет человечности)
  5. Windows с Microsoft SQL Server 2000 (8.0)

Я получаю эту ошибку при попытке сделать, собственный параметр связывает в аргументах функции SQL-СЕРВЕРА:

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

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

  • Все хорошо работает, если я изменяю Версию 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))
  • Соединение становится очень нестабильным после этой ошибки, Вы не можете восстановиться.
  • Ошибка происходит при попытке связать любой тип данных.

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

7
задан nosklo 29 June 2010 в 18:38
поделиться

1 ответ

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

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

На вики Python есть страница по Sybase и еще одна по SQL Server, которые вы, вероятно, захотите просмотреть в поисках альтернатив:

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

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

0
ответ дан 8 December 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: