2010-03-30 68 views
5

如何迭代ResultSet?我試着用下面的代碼,但我得到了錯誤java.sql.SQLException:對空結果集進行非法操作。SQL中的問題,java中的ResultSet

while (!rs.isLast()) { 
    rs.next(); 
    int id = rs.getInt("person_id"); 
    SQL.getInstance().getSt().execute("INSERT ref_person_pub(person_id) VALUES(" + id + ")"); 
} 

更新:我發現了這個問題。我只使用了SQL單例中的一條語句。聲明關閉後,不能再使用。

回答

11

由於每JDBC tutorial

resultSet = statement.executeQuery(); 
while (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

ResultSet#next()光標前移一行從當前位置,並返回true如果新的當前行是有效的。因此,當沒有更多行時,while循環將自動停止。

如果它應該返回零或一排,而不是多行,然後還是用if代替:

resultSet = statement.executeQuery(); 
if (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

這種方式,你有機會添加else

更新,表示與實際問題無關,我在代碼中看到更多潛在問題:首先,您似乎觸發了多個相互依賴的查詢。這可以做得更有效率。您是否熟悉SQL Joins?其次,你不是在泄漏JDBC資源嗎?它看起來像你正在獲得一個聲明,但沒有得到它的處理,以便您可以在使用後妥善關閉它。請參考之前關聯的JDBC教程,以獲得關於如何正確使用JDBC代碼以及如何正確使用JDBC的幾個基本啓動示例的this article的基本說明。否則,當數據庫用完資源時,您的應用程序可能遲早會崩潰。

+0

當我嘗試在while語句中使用rs.next()時,我得到相同的錯誤。 – aphex 2010-03-30 13:39:41

+0

在新獲取的結果集上調用next()時,您可能不可能獲得對空結果集的「非法操作」。所以你的問題在別的地方。無論您是訪問錯誤的結果集,還是錯誤地解釋導致錯誤的異常和/或代碼行。 – BalusC 2010-03-30 14:00:51

+0

如果'getSt'(我建議使用完整的單詞)返回相同的'語句',那麼它不是泄漏。我的JDBC非常生疏,你是否允許繼續使用迭代器,同時在'Statement'上執行另一個語句(壞的比喻:在迭代時改變集合)?無論如何,使用'PreparedStatement'而不是動態SQL。編輯:'語句'API文檔的第二行:「默認情況下,每個Statement對象只能同時打開一個ResultSet對象。」 – 2010-03-30 15:10:23

2
while(rs.next()) { 
    // iterate 
}