2017-02-14 42 views
2

我正在执行Statement查询并将数据存储在ResultSet rs中。关于ResultSet的查询

// if no record is returned by the query 

if (!rs.next()) { 
Step1 
} 

// if atleast one record is returned by the query 

if(rs.next()){ 
do { 

    if (rs.getString(1).equalsIgnoreCase("0")){ 
      Step2 
    } 

    if (rs.getString(1).equalsIgnoreCase("1")){ 
     Step3 
} 
}    while (rs.next()); 
} 

但是,如果我只从查询中获取单个记录,则不执行任何步骤。如果有人能指出这个错误,那将会很有帮助。

+1

注意:if(condition)do {} while(condition);',如果条件完全相同,这与'while(condition){}'相同你使用了一个'else',你可以在其中添加'Step1'' – AxelH

回答

3

您总是跳过第一个元素,因为您在接收元素之前调用.next()两次。 试着做这样的事情:

if (rs.next()) { 
    // At least one record returned 
    do { 
     if (rs.getString(1).equalsIgnoreCase("0")) { 
      // Step2 
     } 

     if (rs.getString(1).equalsIgnoreCase("1")) { 
      // Step3 
     } 
    } while (rs.next()); 
} else { 
    // No records returned 
} 
5

你必须明白next()方法的作用。 next()将光标移动到下一个元素。如果条件通过且在while中没有其他元素,则在里面写入next()

而且你为什么不通过只是在做

while (rs.next()) { 
    if (rs.getString(1).equalsIgnoreCase("0")){ 
      Step2 
    } 

    if (rs.getString(1).equalsIgnoreCase("1")){ 
     Step3 
} 
} 

如果你进入while循环简化代码,有物品,否则号

+0

' ResultSet'没有'hasNext()'方法 –

+0

不,这是['isLast()'](http://docs.oracle.com /javase/7/docs/api/java/sql/ResultSet.html#isLast())。 – AxelH

2

从JavaDoc的ResultSet

将光标从当前位置移动一行。结果集游标最初位于第一行之前;下一个方法的第一个调用使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

在你的代码中,你不需要第二次调用rs.next(),因为游标已经在第一行。

2

最初rs包含一条记录或更精确地指向具有一条记录的结果集。

现在,当if(!rs.next())被调用时,rs移动到结果集中的下一条记录,因为只有一条记录,所以不存在。所以这个如果顺利的话。但是,当您使用if(rs.next())时,rs将不会有任何记录,因此if将不会执行。

2

你不应该叫rs.next()方法两次。以下逻辑应该可以工作:

if (!rs.next()) { 
     Step1 
    } 
    else{ // if atleast one record is returned by the query 

     do { 
      if (rs.getString(1).equalsIgnoreCase("0")){ 
        Step2 
      } 
      if (rs.getString(1).equalsIgnoreCase("1")){ 
       Step3 
     } 
     }while (rs.next()); 
    }