2017-02-14 81 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()); 
    }