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

kal*_*kal 303 java jdbc

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

这是正确的方法

if (!resultSet.next() ) {
    System.out.println("no data");
} 
Run Code Online (Sandbox Code Playgroud)

Sei*_*fer 512

假设您正在使用新返回ResultSet的光标指向第一行之前,更简单的方法是检查它isBeforeFirst().这避免了必须回溯是否要读取数据.

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

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 
Run Code Online (Sandbox Code Playgroud)

 

  • 谢谢,是的,我知道,但我遇到了同样的问题,并且不满意前进检查然后向后阅读.我认为这种更简单的解决方案也会使处于相同情况的其他人受益. (15认同)
  • 请注意,至少对于DB2,结果集必须是"可滚动"类型.这可以在创建要执行的语句时设置. (5认同)
  • [下面Felype的答案](/sf/answers/1102558271/)更完整 (3认同)
  • 来自 Oracle 文档:_注意:对于结果集类型为 TYPE_FORWARD_ONLY_ 的 ResultSet,对 isBeforeFirst 方法的支持是可选的 (2认同)

nin*_*ded 230

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

如果您使用此方法,则可能必须beforeFirst()在重置之后立即调用,因为它现在已将自己定位在第一行之后.

但应该注意的是,Seifer的答案是对这个问题更优雅的解决方案.

  • 但请记住,如果有/行/行,那么在测试之后你将指向第一行.因此,请确保您不会意外跳过一行. (35认同)
  • 您也可以调用`isBeforeFirst()`来测试是否在没有前进光标的情况下返回任何行,然后正常进行. (8认同)

Mas*_*low 50

你可以随时做前一个,然后做一个后循环检查

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

    do {
     //statement(s)
    } while (resultSet.next());
}
Run Code Online (Sandbox Code Playgroud)


kgi*_*kis 19

你通常会这样做:

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}
Run Code Online (Sandbox Code Playgroud)

如果要报告空集,请添加一个计算读取项的变量.如果您只需要阅读单个项目,那么您的代码就足够了.


Fel*_*ype 13

无论光标位置如何,要完全确定结果集是否为空,我会做这样的事情:

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

如果ResultSet为空,则此函数将返回true,否则返回false;如果ResultSet已关闭/未初始化,则返回SQLException.


小智 9

最好使用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());
}
Run Code Online (Sandbox Code Playgroud)


Odd*_*Dev 8

根据最可行的答案,建议是使用"isBeforeFirst()".如果你没有"前进型",这不是最好的解决方案.

有一种叫做" .first() "的方法.获得完全相同的结果并不是一件坏事.您检查"结果集"中是否有某些内容并且不要使光标前进.

文档说明:"(...)如果结果集中没有行,则为false ".

if(rs.first()){
    //do stuff      
}
Run Code Online (Sandbox Code Playgroud)

您也可以调用isBeforeFirst()来测试是否在没有前进光标的情况下返回任何行,然后正常进行. - SnakeDoc 2014年9月2日19:00

但是,"isBeforeFirst()"和"first()"之间存在差异.如果在"仅向前"类型的结果集上完成,则首先生成异常.

比较两个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()

好吧,基本上这意味着你应该使用"isBeforeFirst",只要你有"仅向前"类型.否则使用"first()"就不那么过分了.


Nuo*_*oji 5

如果您想查看结果集中是否有任何行,那将会有效.

请注意,next()始终移动到下一行,因此如果您计划从结果集中进行任何读取,则需要将其考虑在内.

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

while (resultSet.next())
{
   ... read from the row here ...
}
Run Code Online (Sandbox Code Playgroud)

如果您next()已经调用一次以检查结果集是否为空,那么显然无法正常工作,请注意这一点.尽管存在"备份"的方法,但并不支持所有类型的结果集.


JSB*_*ach 5

我相信这是一本实用且容易阅读的文章。

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }
Run Code Online (Sandbox Code Playgroud)