我正在写一个传递大量SQL查询的程序。这个程序一直保持打开状态,并生成查询。所以我必须关闭连接。但是,如果我不关闭连接,db2运行良好,我得到了我所需要的数量。但是我需要关闭它,然后重新连接它。这次,我遇到了下面提到的问题。
下面是该问题的示例代码:
import ibm_db
i=0
while i<5:
cnnNOW = ibm_db.connect("DATABASE=NOW;HOSTNAME=***;PORT=***;PROTOCOL=TCPIP;UID=***;PWD=***;", "", "")
sqlSlc = "SELECT <column_name> FROM <table>"
stmt = ibm_db.exec_immediate(cnnNOW, sqlSlc)
while ibm_db.fetch_row(stmt) != False: #The error occurs here for the second loop
porder = ibm_db.result(stmt, '<column_name>')
ibm_db.close(cnnNOW)
i+=1
在重新连接数据库之前,进度显示了第一个结果。例外为:
Traceback (most recent call last):
File "C:\Users\Burhan\AppData\Local\Programs\Python\Python310\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
exec(code, globals, locals)
File "c:\users\burhan\desktop\uzak\selectdenemesi.py", line 13, in <module>
while ibm_db.fetch_row(stmtNOWs) != False:
Exception: Column information cannot be retrieved:
我使用的是Python 3.10.5和DB2 v10.5.0.420。这些是我的设置。
1条答案
按热度按时间tjvv9vkg1#
这可能是一个常见问题。
你会得到
“无法撷取数据行信息”
在没有结果集的情况下尝试任何获取操作时,换句话说-这是预期的行为。这几乎总是代码中的错误。
在本例中,查询由于某种原因没有返回任何行,但您的代码在没有首先检查执行提取操作是否安全的情况下就运行了提取操作。
或者尝试
exec_immediate
之后的if stmt:
,并将循环置于此块内以进行条件执行,或者最好在循环上使用单个保护,例如:此外,您还应该编写
try:
和except:
(可能还有else:
和finally:
块)来处理任何可能失败的语句,包括connect和close以及exec_immediate。在使用数据库时,假设每个语句都可能失败,并进行防御性编码,记录每个异常并决定重试哪个语句等。在这样的循环中,也可以使用free_result()来释放资源。