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
相关产品推荐
相关产品推荐

