执行包含 USE 语句的批处理时"Invalid cursor state"错误



我尝试使用pypyodbc 1.3.3与Windows上的Python 3.5从Microsoft SQL数据库检索数据,但得到了pypyodbc。ProgrammingError '[24000] [Microsoft] [SQL Server Native Client 11.0] Invalid游标状态',使用以下代码:

import pypyodbc
conn = pypyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=server;DATABASE=database;UID=uid;PWD=pwd')
cursor = conn.cursor()
sql = '''USE database;
SELECT R0
FROM table;'''
cursor.execute(sql)
results = cursor.fetchone()
print(results)

SQL在Microsoft SQL Server Management Studio中工作,连接和执行工作在我编写的另一个脚本中插入到相同的数据库中,如果我删除

也可以工作
results = cursor.fetchone()

到目前为止,我尝试了cursor.fetchone(), cursor.fetchall()和list(cursor),但都产生了相同的结果,这使我相信命令本身不是问题。根据这个微软网站,这意味着没有一个打开的光标,但我可以得到它的描述,所以从我的理解,必须有。

我也遇到过类似的问题。我可以通过删除"USE Database"语句来解决这个问题。

您已经连接到您的数据库:

conn = pypyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=server;DATABASE=database;UID=uid;PWD=pwd')

这根本不是无法执行USE ...语句的问题,只是我们不能将其作为多语句批处理的一部分。所以,这将不工作…

crsr.execute("""
USE master;
SELECT TOP 2 name FROM sys.tables ORDER BY name;
""")
rows = crsr.fetchall()  # error

…但是这可以正常工作

crsr.execute("USE master")
crsr.execute("SELECT TOP 2 name FROM sys.tables ORDER BY name")
rows = crsr.fetchall()

(在pypyodbc 1.3.4和pyodbc 4.0.21上测试)

最新更新