【问题标题】:"Invalid cursor state" error when executing a batch that includes a USE statement执行包含 USE 语句的批处理时出现“无效游标状态”错误
【发布时间】:2016-09-23 15:57:07
【问题描述】:

我尝试在 Windows 上使用 pypyodbc 1.3.3 和 Python 3.5 从 Microsoft SQL 数据库中检索数据,但使用以下代码得到 pypyodbc.ProgrammingError '[24000] [Microsoft] [SQL Server Native Client 11.0] Invalid cursor state' :

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),但都产生了相同的结果,这让我相信命令本身不是问题。 根据this microsoft site,这意味着没有打开的光标,但我可以得到它的描述,所以根据我的理解必须有。

【问题讨论】:

  • 删除USE database 语句并重试。
  • 是的,同意 SSNR。我的理解是微软让你改变数据库。但是 Python 不允许你这样做。您必须首先连接到正确的数据库才能处理您想要的工作,并且不要更改 sql 代码。我认为 Python 使用比 MS 更安全的方法是一个安全问题。
  • 其实只要把SELECT语句改成SELECT R0 FROM database.dbo.table;之类的。这就是 SQL Server 中的多部分命名 - .. 是在任何 DB 中引用表的格式,无论您连接到哪个 DB。

标签: python sql sql-server pypyodbc


【解决方案1】:

这不是无法执行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 测试)

【讨论】:

  • 我将declare 命令作为execute 中的第一个查询,但该变量在第二个查询中未声明
【解决方案2】:

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

您已经在此处连接到您的数据库:

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

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多