ResultSet 不为空,但 resultset.next() 返回 false

Posted

技术标签:

【中文标题】ResultSet 不为空,但 resultset.next() 返回 false【英文标题】:ResultSet is not null yet resultset.next() returns false 【发布时间】:2018-02-08 22:24:42 【问题描述】:

我正在尝试根据特定条件搜索表格。 SQL 查询在 SQL Developer 中执行时返回正确的结果(1 行)。在 JDBC 中,结果集不为空,但 resultset.next() 返回 false。

代码:

public static ArrayList<SearchRecord> searchRecords(Connection conn, int orderID) throws SQLException 

    System.out.println("Order_id: " + orderID); //The correct orderID is passed
    ArrayList<SearchRecord> searchResult = null;
    SearchRecord searchRecord = null;
    PreparedStatement search_pstm = null;
    ResultSet search_rs = null;

    if (conn != null) 
        // This query is successfully executed in SQL Developer and outputs a row
        String search_sql = "select d.PPS_NUM, a.BRC_ORD_ID, PROJECT_NUM, LICENSE_NUM, EXPIRY_DATE, FIRST_NAME, LAST_NAME, ADDRESS1, ADDRESS2, CITY, PROVINCE, POSTAL_CODE from VD_SHIP_AOR a, VD_BRC_ORD b, VD_CONSOL_VALID c, VD_SHIP d where a.brc_ord_id = b.brc_ord_id and b.CONSOL_VALID_ID= c.consol_valid_id and a.SHIP_ID = d.SHIP_ID and d.ORD_ID = b.ORD_ID and d.PPS_NUM = ?";
        search_pstm = conn.prepareStatement(search_sql);
        search_pstm.setInt(1, orderID);
        search_rs = search_pstm.executeQuery();
        searchResult = new ArrayList<SearchRecord>();

        if (search_rs != null) 
            System.out.println("Not null"); //Prints this
            System.out.println(search_rs.isClosed()); //Prints false
            System.out.println(search_rs.getRow()); //Prints 0

            while (search_rs.next())  //Does not enter the while loop, why?
                System.out.println("Inside while rs.next");
                //store resultset's data into arraylist
            
        
    
    return searchResult;

我认为指的是:

Similar Stack Overflow question

Check for emptyResultSet

Similar Java Forums question

但是现有的解决方案对我不起作用,请帮助我解决这个问题。

【问题讨论】:

有没有可能你已经在集合中的唯一结果上,并且没有下一条记录? 不,这不可能,我是第一次打开结果集! 调用getRow()后尝试执行search_rs.beforeFirst() 【参考方案1】:

您似乎假设此方法在没有行的情况下返回null,但事实并非如此。 executeQuery() 方法将永远返回 null*。 API 文档特别说明:

返回: 包含查询产生的数据的ResultSet 对象; 从不null

因此,您的null-check 完全没有必要。它要么产生结果集(即使查询没有产生任何行),要么抛出SQLException,例如语法错误,或者如果执行的语句没有产生结果集(例如更新或删除语句) .

执行后的结果集最初是打开的,并且位于第一行(如果有)之前。如果没有更多行,对ResultSet.next() 的调用将返回false。在这种情况下,您的 select 语句没有产生任何行是合理的,因此结果集是空的,第一次调用 next() 将返回 false

我认为您对 API 的假设不正确。我建议你仔细阅读 JDBC API 文档,也许可以阅读一些关于 JDBC 的教程或介绍性文本。

如果 SQL Developer 显示一行而您的代码没有,请仔细检查 1) 您是否真的使用同一个数据库,2) 使用的 id 是否真的相同,以及 3) 如果您在 SQL 中查看的数据开发人员实际上是承诺的。并考虑首先简化您的查询,例如仅从一个表中选择,删除此订单号上的特定条件以便选择所有行,使用您在 SQL Developer 中使用的相同文字值(在查询中硬编码)等。另外,是你确定你使用了正确的条件,PPS_NUM 看起来不像 Order_id,而例如 ORD_ID 看起来更像一个。

* : 忽略特定驱动程序实现中存在错误的可能性

【讨论】:

我假设该方法在没有行的情况下返回 null,因此陷入了混乱。感谢马克的所有澄清。另外,我发现我的问题的原因是没有在 SQL Developer 中提交数据。因此,它在 Developer 中产生结果,而不是在 JDBC 中。现在可以正常使用了! @Mark 在我的例子中,查询正确地从 SQL Server 数据库中检索了值并且它有记录。但通过 JDBC 结果集,它为 ResultSet.next() 提供 false @AshokkumarGanesan 如果 JDBC 在第一次调用 next() 时返回 false,那么它没有检索任何行,我提到的所有故障排除步骤仍然适用。 好吧,我会解决它,好像我使用一个可以正常工作的简单查询。我需要构造查询吗?喜欢 JOOQ? 验证案例,一切正常。就我而言,我有一个简单的查询,其中包含内部联接和限制为 1 的分组。

以上是关于ResultSet 不为空,但 resultset.next() 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

在MyEclipse中执行模糊查询,ResultSet结果集不为空但rs.next()为false,求解。

jdbc如何判断记录集是否为空?用啥方法?ResultSet本身是否根本就没有这样的方法?

ResultSet 为空,尽管 sql 查询正常但事件

Java ResultSet 为空,但实际上它不应该是

Java之判断ResultSet结果集是否为空

resultSet.getString() 为空值返回啥