如何修复Python代码中HY000错误:SQL参数标记与提供数量不匹配
问题修复方案
错误核心原因
- Access ODBC驱动不支持代码中使用的命名参数占位符(
:param格式),驱动无法识别这类标记,因此触发"SQL包含0个参数标记但提供了1个参数"的报错。 - 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
相关产品推荐
相关产品推荐

