PYODBC中的函数序列错误

18 投票
2 回答
18342 浏览
提问于 2025-04-20 21:53

我正在使用 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.commitcon.commit 是做同样的事情,你只需要用其中一个就可以了。

最后,我建议你习惯在调用 execute 的时候,把第二个参数写成一个元组(tuple):

cursor.execute(SQL_command, (queueNumber,))

你现在的写法在 pyodbc 中可以用,但不符合数据库 API 的标准。

撰写回答