Java JDBC插入表单数据报错Data truncation: firstname列数据过长
问题根因
你遇到的Data truncation: Data too long for column 'firstname' at row 1报错,和数据库字段长度设置无直接关系——你已经验证过,将插入逻辑直接写在按钮点击事件中可以正常运行。问题出在分层调用的取值逻辑错误:addAdmin()方法内部直接通过new Register()创建了一个全新的Register窗体实例,这个实例和屏幕上用户实际填写表单的Register窗体是完全独立的两个对象,上面的输入框没有用户填入的真实数据。如果你的getTxtfirstName()等取值方法实现存在疏漏(比如误返回控件对象的字符串表示、默认初始化的超长占位内容),拿到的字符串长度就会远超数据库字段限制,触发数据截断报错。
修复方案
- 调整方法传参逻辑,不要在数据操作方法内部新建界面对象,将当前用户正在操作的Register实例作为参数传入
addAdmin(),确保取到的是用户真实输入的表单内容。
修改后的按钮事件代码:
修改后的JButton btnregister = new JButton("Register"); btnregister.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DBQueries admin = new DBQueries(); // 传入当前显示的Register窗体实例,监听器写在Register类内部时直接用Register.this指代 admin.addAdmin(Register.this); } });addAdmin()方法实现:// 方法新增Register类型入参,接收外部传入的当前窗体实例 public void addAdmin(Register registration) { // 删除原有错误代码:Register registration = new Register(); String firstname = registration.getTxtfirstName().trim(); String lastname = registration.getTxtlastName().trim(); String email = registration.getTxtemail().trim(); String mobile = registration.getTxtmobile().trim(); String username = registration.getTxtusername().trim(); String password = registration.getTxtpassword().trim(); // 增加前置非空校验,避免空值提交 if(firstname.isBlank() || lastname.isBlank() || email.isBlank() || mobile.isBlank() || username.isBlank() || password.isBlank()) { System.out.println("表单信息不能为空"); return; } String addAdmin = "INSERT into admin (adminid, firstname, lastname, email, mobile, username, password)VALUES (?,?,?,?,?,?,?)"; // 用try-with-resources自动释放数据库资源,避免连接泄漏 try (Connection con = DBConnection.getConnection(); PreparedStatement pst = con.prepareStatement(addAdmin)) { pst.setInt(1, 45); pst.setString(2, firstname); pst.setString(3, lastname); pst.setString(4, email); pst.setString(5, mobile); pst.setString(6, username); pst.setString(7, password); int updatedRowCount = pst.executeUpdate(); if(updatedRowCount > 0) { System.out.println("Admin added successfully"); } else { System.out.println("Failed to add Admin"); } } catch (SQLException e) { System.out.println("SQL Exception"); e.printStackTrace(); } } - 检查Register类中所有
getTxtxxx()取值方法的实现,确认方法返回的是对应输入框调用getText()得到的用户输入字符串,而非控件对象本身、其他冗余拼接内容。正确的取值方法示例:public String getTxtfirstName() { // txtfirstName是界面上“名”输入框对应的组件变量 return txtfirstName.getText(); } - 可选优化:检查数据库admin表的字段长度配置,将字符串类字段设置为合理长度,比如
firstname/lastname设为varchar(50)、password设为varchar(255)(适配密码加密后的密文长度),从表结构层面规避长度溢出问题。
内容的提问来源于stack exchange,提问作者Bibek Bhattarai
相关产品推荐
相关产品推荐

