SQL语句正确但ResultSet为空,执行报错求技术支持
问题排查与修复方案
1. 确认数据库连接环境一致性
检查代码中database.getConnection()获取的连接,和你在IntelliJ工具里使用的是否为同一个数据库实例、同一个schema。这类问题常出现在代码连接测试库/生产库,而工具连接的是另一环境,数据不一致导致查询无结果。
2. 修复PreparedStatement复用问题
你将HELP_STATEMENT定义为类成员变量复用,会引发线程安全问题,还可能因之前调用的残留状态(如连接异常后PreparedStatement失效)导致查询异常。正确做法是在方法内部创建并自动关闭:
public List<Long> deleteArticle(String ext_article_nr) throws SQLException { List<Long> resultList = new ArrayList<>(); // 使用try-with-resources自动关闭资源,避免内存泄漏 try (PreparedStatement stmt = database.getConnection().prepareStatement(HELP_STATEMENT_STR)) { stmt.setString(1, ext_article_nr); System.out.println(stmt.toString()); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { System.out.println("ResultSet is not empty"); // 若a1atnr是数值类型,优先用getLong而非getString resultList.add(rs.getLong("a1atnr")); } if (resultList.isEmpty()) { System.out.println("ResultSet is empty"); } } } return resultList; }
3. 校验参数与字段类型匹配
查看数据库asoatikid字段类型:
- 如果是数值类型(如INT、BIGINT),不要用
setString,改用对应类型方法,比如setLong(1, Long.parseLong(ext_article_nr)),避免字符串转数值的隐式转换错误。 - 如果是字符串类型,确认
ext_article_nr是否包含多余空格、大小写差异(部分数据库字段区分大小写)。
4. 修正ResultSet错误处理逻辑
原代码中无论rs.next()返回true还是false,都直接调用rs.getString("a1atnr"),这在ResultSet为空时必然抛出“ResultSet is not positioned correctly”异常。必须在rs.next()返回true时才读取字段值,用循环处理多行结果。
5. 检查连接字符集配置
若数据库字段使用特殊字符集,确认代码连接URL是否指定了正确的编码参数(如MySQL的useUnicode=true&characterEncoding=UTF-8),避免参数传递时乱码导致匹配失败。
内容的提问来源于stack exchange,提问作者Splatted I0I
相关产品推荐
相关产品推荐

