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

Java删除指定日期前数据库记录时遇无结果集SQLException求助

解决SQLException: Query or procedure does not return a result set 问题

这个问题我太熟了!你肯定是用了executeQuery()方法来执行DELETE语句了——这就是报错的核心原因。

错误根源

executeQuery()是JDBC专门用来执行返回结果集的查询语句(比如SELECT)的方法,而DELETE、INSERT、UPDATE这类数据更新操作,需要用executeUpdate()方法。后者返回的是受影响的行数,不会返回结果集,刚好匹配DELETE语句的特性。

修正方案示例

先看错误的写法(应该就是你现在的代码逻辑):

String deleteSql = "DELETE FROM C35_6 WHERE dTimeOff <= '12/31/1972 23:59:59.999'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(deleteSql); // 这里触发异常!

改成正确的写法,同时推荐用PreparedStatement来处理日期(避免SQL注入+兼容数据库日期格式):

// 用占位符代替直接拼接日期字符串
String deleteSql = "DELETE FROM C35_6 WHERE dTimeOff <= ?";

// 使用try-with-resources自动关闭资源,避免内存泄漏
try (PreparedStatement pstmt = connection.prepareStatement(deleteSql)) {
    // 解析你的日期格式(和插入语句一致:MM/dd/yyyy HH:mm:ss.SSS)
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS");
    Date cutoffDate = dateFormat.parse("12/31/1972 23:59:59.999");
    
    // 设置Timestamp参数,匹配数据库的datetime类型
    pstmt.setTimestamp(1, new Timestamp(cutoffDate.getTime()));
    
    // 执行更新操作,获取受影响行数
    int deletedCount = pstmt.executeUpdate();
    System.out.println("成功删除 " + deletedCount + " 条记录");
} catch (ParseException | SQLException e) {
    // 这里可以根据业务需求做更友好的错误处理,比如日志记录
    e.printStackTrace();
}

额外注意事项

  • 永远不要直接拼接日期字符串到SQL语句里,不仅容易出现格式不兼容问题,还会有SQL注入风险,PreparedStatement是最优解
  • 确认你的日期格式和数据库中dTimeOff字段的类型匹配(比如你的字段是datetime/timestamp,用Timestamp参数就没问题)
  • 如果你用的是Java 8+,可以用DateTimeFormatter代替SimpleDateFormat,线程更安全:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss.SSS");
LocalDateTime cutoffLocalTime = LocalDateTime.parse("12/31/1972 23:59:59.999", formatter);
pstmt.setObject(1, cutoffLocalTime);

内容的提问来源于stack exchange,提问作者Jeff H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:50:18