2014-09-06 39 views
1

這是我的一個按鈕行爲。 我的問題是resultset.first();不會將光標返回到第一行。 這是我的代碼resultset.first();不會返回到第一行

public void Menu3_next(JTextField jTextField1, JTextField jTextField2, JComboBox jComboBox1, JComboBox jComboBox2){ 
    Connect();  
    try{ 
     statement = connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
     resultset = statement.executeQuery("select * from Menu3"); 
     resultset.first(); 
     while(resultset.next()){ 
      jTextField1.setText(String.format("%s", resultset.getString("idMenu3"))); 
      jTextField2.setText(String.format("%s", resultset.getString("Name"))); 
     } 
     String query1 = String.format("select * from Menu1");// where idMenu1 = '%s'",strBrand); 
     resultset = statement.executeQuery(query1); 
     resultset.first(); 
     while(resultset.next()){ 
      jComboBox1.addItem(String.format("%s", resultset.getString("Brand"))); 
     } 
     String query2 = String.format("select * from Menu2");// where idMenu= '%s'",strPart); 
     resultset = statement.executeQuery(query2); 
     resultset.first(); 
     while(resultset.next()){ 
      jComboBox2.addItem(String.format("%s", resultset.getString("Part"))); 
     } 
    } 
    catch(SQLException ex){ 
     System.out.println(ex); 
    } 
} 

TIA Guys。當我點擊按鈕時,它必須顯示下一個和下一個,直到最後一行。但它沒有。它只顯示最後一行。

+0

是否有任何理由跳過第一行?你調用'resultset.first()'和'resultset.next()',所以第一個訪問的結果是第二行。 – Tom 2014-09-06 14:51:17

回答

0

我沒有足夠透徹地閱讀這個問題,我的回答涵蓋了另一個問題,我相信......正如其他答案中指出的,您的問題是使用first()next(),但我相信我所說的是仍然有效。

如果不包含明確的ORDER BY,返回的集合中的行的順序將是任意的。你的問題的解決方案是最有可能在查詢中指定的順序:

SELECT * FROM Menu3 ORDER BY ...

此外,使用select *被認爲是不好的做法,看到Bad habits to kick : using SELECT */omitting the column list的原因(也Why is SELECT * considered harmful)。

+0

因此,跳過結果集條目的解決方案是'ORDER BY'語句?聽起來不錯。你能解釋一下嗎? – Tom 2014-09-06 14:54:33

+0

@湯姆不,當然不是,我從來沒有說過,是嗎?我的答案意在指出,行可能不以特定的順序出現,因此如果預期集合中的第一行稍後出現,則可以將其視爲行被跳過。重讀這個問題之後,似乎這裏的問題是使用'first()'和'next()'。在我看來,'ORDER BY'仍然很重要。 – jpw 2014-09-06 15:02:49

+0

即時通過使用順序和不使用第一(),但仍然相同:3 – 2014-09-06 16:28:53

1

while (resultset.next()) { ... }成語期望光標是之前的第一行。當您撥打resultset.first()時,光標移動到第一行,然後resultset.next()將再次向前移動光標,有效地跳過第一行。

註釋掉所有resultset.first()語句來解決,例如:

resultset = statement.executeQuery("select * from Menu3"); 
//resultset.first(); 
while (resultset.next()) { 
    jTextField1.setText(String.format("%s", resultset.getString("idMenu3"))); 
    jTextField2.setText(String.format("%s", resultset.getString("Name"))); 
} 
+0

仍然相同。它仍然會得到最後一行並顯示它。順便說一句,感謝:3 – 2014-09-06 16:25:47

0

沒有必要在這裏呼籲first()。在執行查詢之後,ResultSet定位在之前,第一行爲。後續調用next()將向前移動,直到沒有更多行。

您當前的代碼具有以下步驟:

  1. 農產品ResultSet(定位之前第一行)
  2. 呼叫first()(定位在第一行)
  3. 呼叫next()在環(定位在第二,第三等行)
    • 你對該行做了些什麼(第二,第三等,但不是第一

通過調用first()next()後續調用,你是跳過第一行

你似乎有這個想法的ResultSet是整個方法的過程中相同的對象:不是,每次調用executeQuery產生ResultSet。作爲正確關閉資源的問題,您應該開始使用帶有JDBC資源的try-with-resources,以確保在您完成之後,ResultSetStatementConnection已正確關閉。


關於你的第二個問題:您使用setTextsetText替換場的全部內容。所以當然它只會顯示最後一行。

PS在stackoverflow你應該堅持每個問題的一個問題。