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

库存管理程序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,自然找不到对应记录。

其他次要问题修复

  1. 缩进混乱:try块内部分代码缩进错误,会导致逻辑执行异常;
  2. 重复结果判断:函数末尾重复的cursor.rowcount判断会覆盖之前的提示信息,需移除;
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:06:03