resultset.first();不会将它返回到第一行

时间:2014-09-06 14:44:29

标签: java sql

这是我的按钮行为之一。 我的问题是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伙计们。当我点击按钮时,它必须显示下一个,下一个和下一个,直到最后一行。但它没有。它只显示最后一行。

3 个答案:

答案 0 :(得分: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")));
}

答案 1 :(得分: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)。

答案 2 :(得分:0)

此处无需拨打first()。执行查询后,ResultSet位于之前第一行。随后的调用next()将向前移动,直到没有更多行。

您当前的代码包含以下步骤:

  1. 制作ResultSet(位于之前第一行)
  2. 致电first()(位于第一行)
  3. 在循环中调用next()(位于第二行,第三行等)
    • 您对该行执行某些操作(第二行,第三行等,但不是第一行
  4. 通过致电first()并随后致电next(),您跳过第一行

    您似乎认为ResultSet在整个方法中是同一个对象:事实并非如此,每次调用executeQuery都会产生 new {{ 1}}。关于正确关闭资源的问题,您应该开始使用try-with-resources和JDBC资源,以确保完成后ResultSetResultSetStatement正确关闭


    关于您的第二个问题:您使用ConnectionsetText替换该字段的全部内容。所以当然它只会显示最后一行。

    PS在stackoverflow上你应该坚持每个问题一个问题。