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

通过JDBC向PostgreSQL插入日期数据出现类型错误如何解决?

问题原因

你现有代码存在几个明显的语法和类型匹配错误:

  • SimpleDateFormat.parse() 方法未传入需要解析的日期输入字符串,调用逻辑本身不合法
  • parse() 方法返回的是 java.util.Date 类型,而 PreparedStatement.setDate() 要求传入 java.sql.Date 类型,你已经做了类型转换但未使用转换后的变量
  • 仅捕获了 SQLException,未处理日期解析必然会抛出的 ParseException,会直接编译失败
  • 额外提示:如果数据库中cad_idade字段为数值类型,直接传递字符串也会触发类型报错,建议同步修正

修正后的代码

try {   
    conecta.conn.setAutoCommit(false);
    PreparedStatement pst = conecta.conn.prepareStatement("INSERT INTO cad_pessoa(cad_cpf,cad_nome, cad_idade, cad_apelido, cad_data) values (?,?,?,?,?)");

    pst.setString(1, jFormattedTextFieldCPF.getText()); 
    pst.setString(2, jTextFieldNOME.getText()); 
    // 如果数据库cad_idade是数值类型,替换为下面这行
    // pst.setInt(3, Integer.parseInt(jTextFieldIDADE.getText()));
    pst.setString(3, jTextFieldIDADE.getText()); 
    pst.setString(4, jTextFieldApelido.getText());
    
    // 修正日期处理逻辑
    SimpleDateFormat formatter  = new SimpleDateFormat("dd/MM/yyyy");
    // 传入日期输入字符串,先解析为util.Date再转为sql.Date
    java.util.Date inputDate = formatter.parse(jFormattedTextFieldDATA.getText());
    java.sql.Date data = new java.sql.Date(inputDate.getTime());
    pst.setDate(5, data); 

    pst.executeUpdate(); 
    conecta.conn.commit();

    // 后续清空字段、弹窗逻辑保持不变
    jFormattedTextFieldCPF.setText(""); 
    jTextFieldNOME.setText(""); 
    jTextFieldIDADE.setText(""); 
    jFormattedTextFieldDATA.setText("");
    jTextFieldApelido.setText(""); 

    jFormattedTextFieldCPF.setEnabled(false);
    jTextFieldNOME.setEnabled(false);
    jTextFieldIDADE.setEnabled(false);
    jFormattedTextFieldDATA.setEnabled(false);
    jTextFieldApelido.setEnabled(false);
    JOptionPane.showMessageDialog(null, "Salvo!");

} catch (SQLException ex) {
    JOptionPane.showMessageDialog(rootPane, "Erro!\n" +ex);
} catch (ParseException ex) {
    // 处理日期格式错误场景,比如用户输入不符合dd/MM/yyyy格式
    JOptionPane.showMessageDialog(rootPane, "日期格式错误,请按照日/月/年格式输入:\n" + ex);
}

额外优化建议

如果使用Java 8及以上版本,建议用新的时间API替换SimpleDateFormat,避免线程安全问题和解析隐患:

  • 用DateTimeFormatter替换SimpleDateFormat
  • 用LocalDate接收解析结果,再通过java.sql.Date.valueOf(localDate)转为数据库需要的日期类型

内容的提问来源于stack exchange,提问作者Luís Felipe Ambrozin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:39:04