我在Ubuntu 10.04 Lucid LTS上使用以下软件栈
连接到数据库:
-
python 2.6.5(Ubuntu包)
-
pyodbc git trunk提交
eb545758079a743b2e809e2e219c8848bc6256b2
-
unixodc 2.2.11(Ubuntu包)
-
freetds 0.82(Ubuntu软件包)
-
带Microsoft SQL Server 2000(8.0)的Windows
当尝试在参数中进行本机参数绑定时,会出现此错误
到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',))
进一步调查显示
奇怪的
我想谈的事情:
-
如果我将TDS版本改为4.2,一切都可以正常工作(但是,
来自SQL Server的版本报告错误--使用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))
-
这个错误之后,连接变得非常不稳定,您无法恢复。
-
尝试绑定任何类型的数据时都会发生错误。
我怎样才能更进一步?我想对函数参数进行本机绑定。