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

时间:2018-02-08 22:24:42

标签: java sql oracle jdbc resultset

我尝试根据特定条件搜索表格。 SQL查询在SQL Developer中执行时返回正确的结果(1行)。在JDBC中,结果集不为null,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

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

1 个答案:

答案 0 :(得分:2)

如果没有行,您似乎假设此方法返回null,情况并非如此。方法executeQuery() 永远不会返回null * 。 API文档具体说:

  

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

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

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

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

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

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