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,求解。