Tkinter GUI更新MySQL学生数据报错及日期无法添加求助
解决Tkinter学生管理GUI中MySQL更新报错"Not all parameters were used in sql statement"的问题
错误原因分析
- 参数与SQL字段顺序完全错位:SQL语句中
UPDATE的字段顺序和传入的参数列表顺序不匹配,导致MySQL无法将参数正确绑定到对应字段,触发"Not all parameters were used"错误。 askyesno返回值判断错误:messagebox.askyesno()返回布尔值True/False,原代码用upadate > 0判断会引发类型错误,且提交、关闭连接等逻辑位置错误,未确认更新也会执行。- 日期格式不兼容:若
self.var_dob.get()获取的日期格式不符合MySQLDATE类型要求(如DD/MM/YYYY),会导致日期无法写入。
修正后的代码
def update_data(self): if ( self.var_dep.get() == "Select Department" or self.var_std_name.get() == "" or self.var_std_id.get() == "" ): messagebox.showerror("Error", "All fields are required", parent=self.root) else: try: confirm_update = messagebox.askyesno( "Update", "Do you want to update this student details", parent=self.root ) if confirm_update: conn = mysql.connector.connect( host="localhost", username="root", password="K2412@", database="face_recognizerr", ) my_cursor = conn.cursor() # 严格对齐SQL字段与参数顺序 my_cursor.execute( """update student set Dep=%s, course=%s, year=%s, semester=%s, Division=%s, Roll=%s, Gender=%s, Dob=%s, Email=%s, Phone=%s, Address=%s, Lecturer=%s, PhotoSample=%s where student_id=%s""", ( self.var_dep.get(), # 对应Dep self.var_course.get(), # 对应course self.var_year.get(), # 对应year self.var_semester.get(), # 对应semester self.var_div.get(), # 对应Division self.var_roll.get(), # 对应Roll self.var_gender.get(), # 对应Gender self.var_dob.get(), # 对应Dob self.var_email.get(), # 对应Email self.var_phone.get(), # 对应Phone self.var_address.get(), # 对应Address self.var_lecturer.get(), # 对应Lecturer self.var_radio1.get(), # 对应PhotoSample self.var_std_id.get() # 对应where条件的student_id ), ) conn.commit() messagebox.showinfo( "Success", "Student details successfully updated", parent=self.root ) self.fetch_data() conn.close() else: return except Exception as es: messagebox.showerror("Error", f"Due To:{str(es)}", parent=self.root)
额外的日期格式处理(若需要)
如果你的日期输入框是DD/MM/YYYY格式,需要转换为MySQL支持的YYYY-MM-DD:
from datetime import datetime # 在获取日期参数时添加格式转换 dob_input = self.var_dob.get() try: dob_formatted = datetime.strptime(dob_input, "%d/%m/%Y").strftime("%Y-%m-%d") except ValueError: messagebox.showerror("Error", "Invalid date format, use DD/MM/YYYY", parent=self.root) return # 之后在参数列表中用dob_formatted替代self.var_dob.get()
内容的提问来源于stack exchange,提问作者kyth_99
相关产品推荐
相关产品推荐

