2011-08-19 94 views
1

我打我的數據庫,並得到一個結果,告訴我當前行#爲2到的getRow()的調用,但無法循環,當我調用next()方法:JDBC結果出現異常行爲

// Doesn't even loop once; fails on initial next() call -- entire loop skipped 
try 
{ 
    ResultSet oResults = executeSQL("SELECT * FROM widgets"); 

    // Returns a value of 2 
    int iRowCount = oResults.getRow(); 

    if(iRowCount == 0) 
     return; 

    while(oResults.next()) 
    { 
     // Never gets executed 
    } 

    // This gets executed though, and all the way down... 
    // ... 
} 
catch(Exception e) { handleException(e); } 

我今天早上花了近一個小時,試圖弄清楚發生了什麼,但是這是我想執行的文字代碼(這是一個測試/沙盒項目,所以它可能不會讓邏輯意義上的) 。這發生過任何人?

+6

顯示'executeSQL()'方法的代碼,看起來像是在'ResultSet'上調用'next()'。 – Qwerky

回答

2

標準JDBC庫返回一個ResultSet,它不知道其中有多少行。除非你的實現executeSQL返回一個CachedRowSet(它基本上已預滾動結果集並將所有行加載到內存中),否則在oResults.next()返回false時,您將永遠不會知道行數,直到達到最後。

因此,您通過檢查行數來控制程序流的嘗試將無法執行。

接下來,您撥打ResultSet.getRow()也可能沒用。以下是javadoc所說的內容:

檢索當前行號。第一行是數字1,第二個數字2,依此類推。
注:getRow方法將支持是可選的一個結果集類型TYPE_FORWARD_ONLY

從JDBC驅動程序實現的大多數都只能向前(即你無法通過previous()方法向後滾動),所以結果集getRow()的結果可能沒有用處。

這裏是你的代碼應該是什麼樣子:

ResultSet oResults = executeSQL("SELECT * FROM widgets"); 

while(oResults.next()) 
{ 
    // Process rows 
} 

如果您還沒有進入while循環,這意味着你的查詢沒有返回行 - 有沒有其他的解釋。如果沒有行是「不可能的」,那麼我建議你檢查你的連接參數,以確保你連接到正確的數據庫(而不是本地主機)。

+0

你還應該覆蓋'executeSQL()'方法不應該在ResultSet中調用'next()'方法,或者至少在返回之前重置行索引。 – BalusC

1

getRow()方法允許您檢查當前遊標所在的行的編號,因此對next()的調用超出了結果集的範圍。設置iRowCount後,嘗試設置oResults.absolute(0);