【发布时间】:2018-07-17 16:41:04
【问题描述】:
目前我成功连接到数据库,然后执行一些 sql 语句,但是当我尝试检索查询结果时,我遇到以下raise ProgrammingError(state,err_text)
pypyodbc.ProgrammingError: ('24000', '[24000] [Microsoft][ODBC SQL Server Driver]Invalid cursor state')。
这是我的代码:
# Connection to MSSQL
import pypyodbc
connection_live_db = pypyodbc.connect(driver="{SQL Server}", server="xxx.xxx.xxx.xxx", uid="test",
pwd="xxxx", Trusted_Connection="No")
credit_hold_co = connection_live_db.cursor()
# read the sql file in buffer and close
read_sql_file = open('C:\\Users\\userX\\Documents\\Scripts\\credit_hold_co.sql','r')
sql_file = read_sql_file.read()
read_sql_file.close()
# split each sql statement by ;
sqlCommands = sql_file.split(';')
results_sql = ""
# iterate over each command and execute it
for command in sqlCommands:
try:
credit_hold_co.execute(command)
except ValueError:
print(command)
# retrieve results
results = results + str(credit_hold_co.fetchall())
# close sql connection
credit_hold_co.close()
这是我尝试执行的 sql 命令的示例:
-- credit_hold_co
if OBJECT_ID('tempdb..#Credit_Hold_CO') is not NULL
drop table #Credit_Hold_CO;
create table #Credit_Hold_CO
([co_num] varchar(30),
[credit_hold] char(1),
[credit_hold_reason] char(5),
['Type of credit hold reason'] varchar(20),
[credit_hold_date] datetime );
insert into #Credit_Hold_CO([co_num],[credit_hold],[credit_hold_reason],['Type of credit hold reason'],[credit_hold_date])
select distinct co_num, credit_hold, credit_hold_reason,
(case
when credit_hold_reason = 'PD' then 'Past due payments'
when credit_hold_reason = 'BR' then 'Bankruptcy'
end) as 'Type of credit hold reason',
credit_hold_date
FROM [Database].[dbo].[co] where credit_hold = '1';
select * from #Credit_Hold_CO
order by orig_site;
drop table #Credit_Hold_CO;
我找到了一些指向当前问题的链接,例如pypyodbc invalid cursor name 和SQL statement invalid cursor state 24000,并且都建议创建另一个游标以避免第一个游标的结果无效,但没有提供更多详细信息。
问题和答案于 7 月 17 日 @13:31 MT 更新:
- 如何正确检索我的 sql 语句的结果? 请参阅下面的答案。
- 我是否非常需要另一个游标或有更好的方法来解决这个问题? 不,另一个游标不是解决方案,而是从 SQL 查询中删除临时表。
【问题讨论】:
-
['Type of credit hold reason'] varchar(20),无效,不确定这是否只是一个示例,但名称中不能有引号 -
运行
['Type of credit hold reason'] varchar(20)在查询中工作正常。 -
哎呀!糟糕:)
-
不用担心,感谢您尝试提供一些可能出错的线索。
-
我有一些代码几乎完全符合您的要求。没有足够的空间把它作为评论。我可以建议运行:
credit_hold_co = connection_live_db.cursor()并在 while 循环中关闭它吗?这听起来像你的2.项目:)
标签: sql-server python-3.x sql-server-2008 tsql