PYODBC中的函数序列错误
我正在使用 pyodbc
来连接一个数据库,并从中提取一些数据。
这是我的代码:
con = pyodbc.connect("driver={SQL Server};server= MyServer;database= MyDatabase;trusted_connection=true")
cursor = con.cursor()
SQL_command = """
SELECT RowID = ISNULL
(
(
SELECT TOP 1 RowID
FROM [MyDatabase].[admin].[MyTable]
WHERE [queue] = ? and processed IS NULL
)
,-1
)
"""
cursor.execute(SQL_command, queueNumber)
cursor.commit()
con.commit()
result_set = cursor.fetchall()
但是在我运行上面的代码后,出现了以下错误:
pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC SQL Server Driver]功能顺序错误 (0) (SQLFetch)')
请问是什么原因导致了这个问题,我该如何解决呢?
谢谢。
2 个回答
1
我遇到了两个错误,基本上是交替出现的:
pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC Driver 17 for SQL Server]Function sequence error (0) (SQLGetData)')
pyodbc.Error: ('HY007', '[HY007] [Microsoft][ODBC Driver 17 for SQL Server]Associated statement is not prepared (0) (SQLNumResultCols)')
我的问题是,有两个线程在使用同一个连接,这导致了准备好的语句出现了奇怪的状态。我通过为每个线程创建一个新的连接来解决这个问题。
36
我觉得你的问题出在那些奇怪的 commit
语句上。你只需要在插入或更新记录的时候使用 commit
,而不是在选择数据的时候。
cursor.execute(SQL_command, queueNumber)
result_set = cursor.fetchall()
另外,以后使用 commit
的时候,cursor.commit
和 con.commit
是做同样的事情,你只需要用其中一个就可以了。
最后,我建议你习惯在调用 execute 的时候,把第二个参数写成一个元组(tuple):
cursor.execute(SQL_command, (queueNumber,))
你现在的写法在 pyodbc
中可以用,但不符合数据库 API 的标准。