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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:27:19