2013-04-18 54 views
0

看看這段代碼:在Java中,爲什麼ResultSet不允許您運行next()超過1次?

ResultSet results=preparedStmt.executeQuery(); 

while (results.next()){ 
    String subject=results.getString(1); 
    System.out.println(subject +" 1st time"); 
} 

while (results.next()){ 
    String subject=results.getString(1);    
    System.out.println(subject+ " 2nd time"); 
} 

爲什麼系統只打印出第一次時的結果,&不打印出結果在第二次?

如果我們想運行results.next()超過1次,那麼代碼的正確方法是什麼?

+1

在精細的手工只需一眼.. ['ResultSet.first()' ](http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#first%28%29)? –

+0

因爲您已達到結果的結尾。 ResultSet(當天返回)是單方向可穿越的(其中支持雙向遊標的驅動程序較少,而那些驅動程序支持雙向遊標)。 – MadProgrammer

+1

@Andrew:差不多。這是另一個。從javadoc的第2段開始:*「最初,遊標位於**第一行之前**。」*。有一個'beforeFirst()'方法就是這麼做的。但是,規範方法是將結果集映射到bean集合,儘快關閉所有內容,然後對該集合進行後處理。 – BalusC

回答

1

while(rs.next())會將'當前行'光標前移到該集合的末尾。

默認情況下,ResultSet是隻讀的,只能轉發,因此一旦你到達最後,你需要調用first()重新開始。注意:first()是一種可選方法,可能不會被驅動程序支持。

3

您沒有運行.next()一次。一個while循環會多次運行它,直到達到結果集的末尾。當到達第二個while循環時,結果集中沒有任何內容可以結束:您在結尾處。你必須再次運行查詢重新開始或生成scrollable resultset

 Statement stmt = con.createStatement(
             ResultSet.TYPE_SCROLL_INSENSITIVE, 
             ResultSet.CONCUR_UPDATABLE); 
     ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"); 
     // rs will be scrollable, will not show changes made by others, 
     // and will be updatable 

,並呼籲rs.first()

相關問題