2010-06-05 63 views
0

代碼似乎工作正常,但我注意到,每當我查詢一個字符串只有一個結果,它什麼都沒有返回。不知何故,我跳過了我想的第一個結果,但不知道爲什麼。ResultSet失去第一個值

else{ 
    Conn con = null; 
    try { 
    con = new Conn(); 
    } catch (Exception e) { 

    e.printStackTrace(); 
    } 
    String sql = "SELECT productname, quantityperunit, unitprice FROM products pr, categories ca WHERE pr.categoryID = ca.categoryID AND ProductName LIKE '%" + searchTerm + "%'"; 
    System.out.println("last try"); 
    try { 
    searchResults = con.query(sql); 

    if (searchResults.next()){ 
    session.setAttribute("searchResults", searchResults); 
    } 


    } catch (Exception e) { 

    e.printStackTrace(); 
    } 


    } 

,這是上述顯示用代碼:

java.sql.ResultSet resultSet = (java.sql.ResultSet) session.getAttribute("searchResults"); 
    if(resultSet == null){ 
    out.println("Nullified"); 
    } 
if(resultSet!=null){ 
    out.println("<table border='1'>"); 
    out.println("<tr><th>Product Name</th><th>Quantity per Item</th><th>Price</th><th>Quantity</th><th><Add to Cart</th></tr>"); 
    while(resultSet.next()){  
     out.println("<tr><td>"+resultSet.getString("ProductName")+"</td></tr>"); 
    } 
    out.println("</table>"); 
} 

任何幫助,將不勝感激。

+0

遺憾的格式,我似乎無法得到它的工作的權利... – javArc 2010-06-05 00:15:05

+0

要格式化代碼,用它縮進4個空間。您可以通過在編輯器工具欄或Ctrl + K鍵中選擇並按下'010101'按鈕來完成。我已經爲你做了。 – BalusC 2010-06-05 00:18:26

+1

Khorkrak已經將它釘牢了。我只想補充說,這是**真的不是**編碼的方式。 JDBC代碼泄露資源。模型,視圖和控制器邏輯混合在一起。異常處理是假的。會話範圍被濫用。我已經發布了幾個答案,之前如何以正確的方式做到這一點,看看:[this](http://stackoverflow.com/questions/2219238#2219238),[this](http:// stackoverflow。 (1832524)和[this](http://stackoverflow.com/questions/2428468#2428468)。 – BalusC 2010-06-05 00:26:46

回答

0

我想象resultSet.next()將光標移動到下一個結果,因此它會立即跳過while循環的第一次迭代的第一個結果。

+0

呵呵。有另一種方法來檢查我的結果集是否爲空? – javArc 2010-06-05 00:19:20

+0

是的,將它映射到'List ',並用'List#isEmpty()'或'List#size()'進行測試。另見[這個答案](http://stackoverflow.com/questions/2591732/how-to-check-if-resultset-has-only-one-row-or-more/2592141#2592141)。 – BalusC 2010-06-05 00:22:56

4

更改此:

while(resultSet.next()) { 
    out.println(""+resultSet.getString("ProductName")+""); } out.println(""); 
} 

要這樣:

do { 
    out.println(""+resultSet.getString("ProductName")+""); } out.println(""); 
} while(resultSet.next()); 
+0

只是測試了這一點,它的工作很好,如果我的JSTL嘗試失敗,會回落到它。 Thx男人! – javArc 2010-06-05 00:35:43