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

如何修复Python代码中HY000错误:SQL参数标记与提供数量不匹配

问题修复方案

错误核心原因

  1. Access ODBC驱动不支持代码中使用的命名参数占位符(:param格式),驱动无法识别这类标记,因此触发"SQL包含0个参数标记但提供了1个参数"的报错。
  2. SQL语句中使用了Access的保留字(user、create),未做转义处理,会导致SQL解析异常。

修复后的代码

def update_record():
    # 获取选中记录
    selected = my_tree.focus()
    # 更新Treeview显示内容
    my_tree.item(selected, text="", values=(casr_entry.get(), fn_entry.get(), loc_entry.get(), draw1_entry.get(), draw2_entry.get(), draw3_entry.get(), superv_check.get(), create_check.get(), void_check.get(), active_check.get(), recon_check.get(), drwer_check.get(), ))

    # 连接数据库并执行更新
    conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=\\<CONNECT TO DATABASE LOCATION HERE>.mdb;')
    c = conn.cursor()    

    # 调整SQL占位符格式,转义保留字
    c.execute("""UPDATE Users SET
        active = ?,
        fullname = ?,
        location = ?,
        [create] = ?,
        supervisor = ?,
        void_rights = ?,
        reconcile = ?,
        drawers = ?,
        drawer1 = ?,
        drawer2 = ?,
        drawer3 = ?
        WHERE [user] = ?""",
        # 参数顺序必须与SQL中问号的出现顺序完全对应
        active_check.get(),
        fn_entry.get(),
        loc_entry.get(),
        create_check.get(),
        superv_check.get(),
        void_check.get(),
        recon_check.get(),
        drwer_check.get(),
        draw1_entry.get(),
        draw2_entry.get(),
        draw3_entry.get(),
        casr_entry.get()
    )

    conn.commit()
    conn.close()

关键修改说明

  • 把所有命名占位符(:active、:fn等)替换为问号?,这是Access ODBC驱动唯一识别的参数标记格式。
  • 用方括号[]包裹Access保留字user和create(即[user]、[create]),避免SQL语法错误。
  • 参数传递改为位置参数,顺序必须和SQL语句中?的出现顺序完全匹配,不能错位。

内容的提问来源于stack exchange,提问作者marcspector1972

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:53:21