库存管理程序Update功能异常:点击OK始终提示‘ID未找到’求助
问题分析与修复方案
核心错误:SQL参数顺序完全不匹配
你的UPDATE语句参数顺序和传入的元组顺序完全对应错误,这是触发“ID not found”的根本原因:
原SQL语句的占位符顺序是:
UPDATE parts_table SET PartName = ?, MinArea = ?, MaxArea = ?, NumberOfHoles = ?, MinDiameter = ?, MaxDiameter = ?, Count = ? WHERE Reference = ?
对应的参数必须严格按照SET字段顺序 + WHERE条件字段排列,但你当前传入的元组把new_reference(要匹配的Reference值)放到了MinArea的位置,最后用new_count去匹配Reference,自然找不到对应记录。
其他次要问题修复
- 缩进混乱:try块内部分代码缩进错误,会导致逻辑执行异常;
- 重复结果判断:函数末尾重复的
cursor.rowcount判断会覆盖之前的提示信息,需移除; - else分支逻辑:原else分支缩进错误,无法正确触发字段校验失败的提示。
修复后的完整代码
def ok_update(self): db = sqlite3.connect("parts.db") cursor = db.cursor() new_reference = self.reference.text() new_part_name = self.part_name.text() new_min_area = self.min_area.text() new_max_area = self.max_area.text() new_number_of_holes = self.number_of_holes.text() new_min_diameter = self.min_diameter.text() new_max_diameter = self.max_diameter.text() new_count = self.count.text() try: if (new_reference.strip() and new_part_name.strip() and new_min_area.strip().isdigit() and new_max_area.strip().isdigit() and new_number_of_holes.strip().isdigit() and new_min_diameter.strip().isdigit() and new_max_diameter.strip().isdigit() and new_count.strip().isdigit()): update_query = '''UPDATE parts_table SET PartName = ?, MinArea = ?, MaxArea = ?, NumberOfHoles = ?, MinDiameter = ?, MaxDiameter = ?, Count = ? WHERE Reference = ?''' # 严格对应SQL占位符顺序:SET字段值在前,WHERE条件值在后 cursor.execute(update_query, ( new_part_name, new_min_area, new_max_area, new_number_of_holes, new_min_diameter, new_max_diameter, new_count, new_reference )) db.commit() if cursor.rowcount > 0: self.show_label.setText("Updated Successfully") else: self.show_label.setText("ID not found") # 清空输入字段 self.reference.clear() self.part_name.clear() self.min_area.clear() self.max_area.clear() self.number_of_holes.clear() self.min_diameter.clear() self.max_diameter.clear() self.count.clear() else: self.show_label.setText("Please fill in all fields to update data.") except sqlite3.DatabaseError as error: self.show_label.setText(f"Error: {error}") finally: # 确保数据库连接关闭 db.close()
额外建议
- 可以在执行UPDATE前先查询是否存在对应Reference的记录,提前给用户更明确的提示;
- 数字类型字段建议转换为int/float后再存入数据库,避免字符串类型带来的潜在问题。
内容的提问来源于stack exchange,提问作者DelEnd
相关产品推荐
相关产品推荐

