pyodbc执行fetchone报HY010函数序列错误(SQLFetch)原因求解
报错根因
你遇到的HY010 Function sequence error报错,核心原因是游标和数据库连接已经被提前关闭,无法执行拉取数据的操作。
你的代码里用了Python上下文管理器(with语句)创建数据库连接和游标:
- 退出
with coca.cursor() as cola的代码块时,游标cola会被自动关闭 - 退出外层
with pyodbc.connect(...) as coca的代码块时,数据库连接会被自动关闭
你把cola.fetchone()写在了两个with块的外面,执行到这行代码时,游标和连接都已经失效,自然无法正常拉取查询结果。
修复方案
把所有用到cola游标拉取数据的逻辑,全部缩进放到cursor的with代码块内部即可,修复后的核心代码参考:
def gotorasp1(self): with pyodbc.connect( 'DRIVER=' + driver + ';SERVER=' + server + ';PORT=1433;DATABASE=' + database + ';UID=' + username + ';PWD=' + password) as coca: with coca.cursor() as cola: cola.execute("SELECT * FROM Data") # 所有和cola相关的操作都移到with块内部 mac = cola.fetchone() log = self.login.text() pas = self.passw.text() ind = 0 check = 0 un = "" # 额外加mac非空判断,避免结果不足5条时访问属性报错 while ind != 5 and mac is not None: if log == mac.Login: if pas == mac.Password: un = mac.Lname check = check + 1 mac = cola.fetchone() ind = ind + 1 # 不需要使用游标、连接的逻辑可以放在with块外部 if check == 1: self.username_labl_11.setText(_translate("MainWindow", un)) self.login.setText("") self.passw.setText("") MainWindow.setMinimumSize(QtCore.QSize(1180, 800)) MainWindow.setMaximumSize(QtCore.QSize(16777215, 16777215)) desktop = QtWidgets.QApplication.desktop() x = (desktop.width() - MainWindow.width()) // 2 y = (desktop.height() - MainWindow.height() - 90) // 2 MainWindow.move(x, y) self.label_8.setStyleSheet("font: 9pt \"Montserrat\";\ncolor:white") self.stackedWidget1.setCurrentWidget(self.page_2) self.comboBox.setItemText(0, _translate("MainWindow", dw + " " + today.strftime("%d.%m.%Y"))) # 后续cursor查询也要遵守相同的上下文管理规则,同时建议用参数化查询避免注入风险 cursor.execute("SELECT * FROM [dbo].[September] WHERE Day = ?", t) row = cursor.fetchone() # 剩余原有逻辑
额外注意事项
- 所有涉及数据库游标、连接操作的代码,都要放在对应的
with块内部执行,避免资源提前释放导致报错 - 不要直接用f-string拼接SQL语句,存在SQL注入风险,统一用pyodbc的参数化查询语法,用
?作为占位符传递参数 - 循环调用
fetchone时建议加返回值非空判断,避免查询结果条数少于预期时,访问None的属性抛出异常
内容的提问来源于stack exchange,提问作者Slowpoke
相关产品推荐
相关产品推荐

