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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:01:22