You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:09:03