Java ResultSet如何检查是否有任何结果

结果集 hasNext没有方法。 我想检查结果集是否有任何值

这是正确的方法

if (!resultSet.next() ) { System.out.println("no data"); } 

这是正确的,最初ResultSet的光标指向第一行之前,如果第一次调用next()返回false那么在ResultSet没有数据。

如果你使用这个方法,你可能不得不立即调用beforeFirst()来重置它,因为它已经把自己定位在第一行之后了。

但是,应该指出的是, Seifer的答案是对这个问题更为优雅的解决scheme。

假设你正在处理一个新返回的ResultSet它的游标指向第一行之前,更简单的方法是调用isBeforeFirst() 。 这避免了如果要读取数据就必须回溯。

如文档中所述,如果游标不在第一个logging之前,或者ResultSet中没有行,则返回false。

 if (!resultSet.isBeforeFirst() ) { System.out.println("No data"); } 

你总是可以做的下一个前面,只是做一个后循环检查

 if (!resultSet.next() ) { System.out.println("no data"); } else { do { //statement(s) } while (resultSet.next()); } 

你通常会做这样的事情:

 while ( resultSet.next() ) { // Read the next item resultSet.getString("columnName"); } 

如果你想报告一个空集,添加一个variables计数读取的项目。 如果您只需要阅读单个项目,那么您的代码就足够了。

最好使用ResultSet.next()以及do {…} while()语法。

“检查任何结果”调用ResultSet.next()将光标移动到第一行,所以使用do {…} while()语法来处理该行,同时继续处理循环返回的剩余行。

这样你可以检查任何结果,同时也处理返回的结果。

 if(resultSet.next()) { // Checks for any results and moves cursor to first row, do { // Use 'do...while' to process the first row, while continuing to process remaining rows } while (resultSet.next()); } 

根据最可行的答案,build议使用“isBeforeFirst()”。 如果您没有“仅前向型”,那不是最好的解决scheme

有一个叫“ .first() ”的方法。 获得完全相同的结果不那么矫枉过正。 你检查你的“结果集”中是否有东西,并且不要提前你的光标。

该文档指出:“(…)如果结果集中没有行,则为false”。

 if(rs.first()){ //do stuff } 

你也可以直接调用isBeforeFirst()来testing是否有任何返回的行没有前进光标,然后正常进行。 – SnakeDoc 9年9月2日在19:00

但是,“isBeforeFirst()”和“first()”是有区别的。 如果在types为“forward only”的结果集上完成,则首先会生成一个exception。

比较两个throw部分: http : //docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst() http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first()

好的,基本上这意味着只要你有一个“只有前进”的types,你应该使用“isBeforeFirst”。 否则,使用“first()”就不那么矫枉过正了。

如果你想查看结果集中是否有任何行是的,这将工作。

请注意, next()总是移动到下一行,因此如果您计划从结果集中读取数据,则需要考虑这一点。

ResultSet的常用用法(简单阅读时)是:

 while (resultSet.next()) { ... read from the row here ... } 

如果你调用next()一次已经检查结果集是否为空,那么显然不能正确工作,所以要小心。 虽然有“备份”方法,但不支持所有types的结果集。

要完全确定结果集是空的还是不pipe光标位置,我会做这样的事情:

 public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException { return (!rs.isBeforeFirst() && rs.getRow() == 0); } 

如果ResultSet为空,则此函数将返回true,否则返回false,如果该ResultSet已closures/未初始化,则返回SQLException。

 if (!resultSet.isAfterLast() ) { System.out.println("No data"); } 

isAfterLast()对于空的结果集也返回false,但是由于光标位于第一行之前,所以这个方法似乎更清晰。

我相信这是一个实用而易读的作品。

  if (res.next()) { do { // successfully in. do the right things. } while (res.next()); } else { // no results back. warn the user. } 
 if(reset.first) { } else { system.out.println("No raw or reset is empty"); } 

因为如果ResultSet没有raw,那么reset.first返回false。

最好的办法是检查第一行,以便当你打算获取数据时,可以避免跳过一行的错误。 就像:if(!resultSet.first()){System.out.println(“no data”); }

通过使用resultSet.next(),你可以很容易地得到结果,无论resultSet是否包含任何值

 ResultSet resultSet = preparedStatement.executeQuery(); if(resultSet.next()) //resultSet contain some values else // empty resultSet 
 ResultSet rs = rs.executeQuery(); if(rs.next()) { rs = rs.executeQuery(); while(rs.next()) { //do code part } } else { //else if no result set } 

因为当我们调用if(rs.next()){....}第一行将被执行,并且在它后面while(rs.next()){....}我们会从下一行得到结果。 所以我认为if是更好的select,重新执行查询里面。

 ResultSet result = stmt.executeQuery(sqlQuery); if (!result.next()) status = "ERROR"; else status = "SUCCESS"; 

我创build了以下方法来检查ResultSet是否为空。

 public static boolean resultSetIsEmpty(ResultSet rs){ try { // We point the last row rs.last(); int rsRows=rs.getRow(); // get last row number if (rsRows == 0) { return true; } // It is necessary to back to top the pointer, so we can see all rows in our ResultSet object. rs.beforeFirst(); return false; }catch(SQLException ex){ return true; } } 

有以下的考虑是非常重要的:

CallableStatement对象必须设置为让ResultSet对象在最后走到顶部。

TYPE_SCROLL_SENSITIVE :ResultSet对象可以在最后移动并返回顶部。 进一步可以赶上最后的变化

CONCUR_READ_ONLY :我们可以读取ResultSet对象的数据,但不能更新。

 CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 

你可以做这样的事情

 boolean found = false; while ( resultSet.next() ) { found = true; resultSet.getString("column_name"); } if (!found) System.out.println("No Data"); 

我一直在试图设置当前行到第一个索引(处理主键)。 我会build议

 if(rs.absolute(1)){ System.out.println("We have data"); } else { System.out.println("No data"); } 

当填充ResultSet时,它指向第一行之前。 将其设置为第一行(由rs.absolute(1)指示)时,将返回true表示已成功放置在第1行,如果该行不存在,则返回false。 我们可以推断这一点

 for(int i=1; rs.absolute(i); i++){ //Code } 

将当前行设置为位置i,如果该行不存在,将会失败。 这只是一个替代方法

 while(rs.next()){ //Code } 

我认为检查结果集最简单的方法是通过CollectionUtilsorg.apache.commons.collections.CollectionUtils

 if(CollectionUtils.isNotEmpty(resultList)){ /** * do some stuff */ } 

这将检查null以及空的结果集条件。

有关更多详细信息,请参阅以下文档。 CollectionUtils

为什么不使用rs.getRow()?

 int getRow() throws SQLException Retrieves the current row number. The first row is number 1, the second number 2, and so on. Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY Returns: the current row number; 0 if there is no current row Throws: SQLException - if a database access error occurs or this method is called on a closed result set SQLFeatureNotSupportedException - if the JDBC driver does not support this method Since: 1.2 

对我来说,检查“if(rs.getRow()!= 0)”似乎工作得很好。

最初,结果集对象(rs)指向BFR(在第一条logging之前)。 一旦我们使用rs.next(),光标指向第一个logging,rs持有“true”。 使用while循环可以打印表格的所有logging。 在所有的logging被检索后,光标移动到ALR(最后一个logging之后),它将被设置为空。 让我们考虑一下表中有两条logging。

 if(rs.next()==false){ // there are no records found } while (rs.next()==true){ // print all the records of the table } 

简而言之,我们也可以把这个条件写成while(rs.next())。