【问题标题】:move rs.next() forward in jdbc application在 jdbc 应用程序中向前移动 rs.next()
【发布时间】:2014-10-15 16:25:17
【问题描述】:

我正在开发一个使用 JDBC ODBC 连接连接到 Ms Sql 服务器的在线考试软件。我想将结果集光标移动到下一行并向后移动。连接正常,程序可以从数据库中检索字段,所以没有问题。

我在此处的代码位于标有“提交”的按钮上。当您单击此按钮时,它应该移动到数据库中的下一行并从该行中检索数据。检索到的数据应显示在“textarea”中。问题是当我点击下一步时它会显示最后一个结果?

class Abc extends JFrame implements ActionListener
{

    JLabel      l1, l2, l3, l4;
    JButton     b1, b2;
    JTextArea   j1, j2;
    JCheckBox   c1, c2, c3, c4;
    ButtonGroup group   = new ButtonGroup();

    JPanel      panel2;

    Abc ()
    {
        j1 = new JTextArea();
        j2 = new JTextArea();
        c1 = new JCheckBox();
        c2 = new JCheckBox();
        c3 = new JCheckBox();
        c4 = new JCheckBox();
        j1.setEditable(false);
        c1.setSelected(false);
        c2.setSelected(false);
        c3.setSelected(false);
        c4.setSelected(false);

        group.add(c1);
        group.add(c2);
        group.add(c3);
        group.add(c4);

        Connection conn = null;
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:xe", "system",
                    "java");
            System.out.println("Dc is obtained");

        }
        catch (Exception e2)
        {
            System.out.println("conne" + e2.getMessage());
        }
        try
        {
            String sq = "select * from questionans";
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sq);
            System.out
                    .println("------------------------------------------");
            if (rs.next())
            {

                j1.setText(rs.getString(2));
                c1.setText(rs.getString(3));
                c2.setText(rs.getString(4));
                c3.setText(rs.getString(5));
                c4.setText(rs.getString(6));
            }
            System.out
                    .println("-------------------------------------------");
        }
        catch (Exception e1)
        {
            System.out.println("query" + e1.getMessage());
        }
        finally
        {
            try
            {
                conn.close();
            }
            catch (Exception e)
            {
                System.out.println("close conn" + e.getMessage());
            }
        }

        b1 = new JButton("REGISTER");
        b2 = new JButton("SUBMIT");
        panel2 = new JPanel(new GridLayout(4, 1));
        panel2.add(b1);
        panel2.add(j1);
        panel2.add(c1);
        panel2.add(c2);
        panel2.add(c3);
        panel2.add(c4);
        panel2.add(b2);

        add(panel2, BorderLayout.CENTER);
        b1.addActionListener(this);
        b2.addActionListener(this);
        setTitle("REGISTRATION");

    }

    public void actionPerformed (ActionEvent e)
    {
        Object source = e.getSource();
        if (source == b1)
        {
            System.out.println("you pressed button b1");
        }
        else if (source == b2)
        {

            Connection conn = null;

            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection(
                        "jdbc:oracle:thin:@localhost:1521:xe", "system",
                        "java");
                System.out.println("Dc is obtained");

            }
            catch (Exception e4)
            {
                System.out.println("conne" + e4.getMessage());
            }
            try
            {
                String sq = "select * from questionans";
                Statement st = conn.createStatement();
                ResultSet rs = st.executeQuery(sq);
                System.out
                        .println("------------------------------------------");

                while (rs.next())
                {

                    j1.setText(rs.getString(2));
                    c1.setText(rs.getString(3));
                    c2.setText(rs.getString(4));
                    c3.setText(rs.getString(5));
                    c4.setText(rs.getString(6));

                }

                System.out
                        .println("-------------------------------------------");
            }
            catch (Exception e3)
            {
                System.out.println("query" + e3.getMessage());
            }
            finally
            {
                try
                {
                    conn.close();
                }
                catch (Exception e6)
                {
                    System.out.println("close conn" + e6.getMessage());
                }
            }

            String s2 = "";
            if (c1.isSelected())
            {
                s2 = s2 + "" + c1.getText();
            }
            else if (c2.isSelected())
            {
                s2 = s2 + "" + c2.getText();
            }
            else if (c3.isSelected())
            {
                s2 = s2 + "" + c3.getText();
            }
            else if (c4.isSelected())
            {
                s2 = s2 + "" + c4.getText();
            }

            System.out.println("You clicked on " + s2);
        }
    }

}

class xyz
{
    public static void main (String args[])
    {
        Abc a = new Abc();
        a.setSize(1000, 1000);
        a.setVisible(true);
        a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

【问题讨论】:

    标签: java swing jdbc


    【解决方案1】:

    它显示最后一个结果,因为您正在循环所有结果:

    while (rs.next())
    {
        j1.setText(rs.getString(2));
        c1.setText(rs.getString(3));
        c2.setText(rs.getString(4));
        c3.setText(rs.getString(5));
        c4.setText(rs.getString(6));
    }
    

    应在侦听器之外检索 ResultSet,将这些变量声明为对您的类公开并在您的构造函数中初始化它们:

    String sq = "select * from questionans";
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(sq);
    

    在你的监听器中将 while 语句更改为 if :

    if(rs.next())
    {
        j1.setText(rs.getString(2));
        c1.setText(rs.getString(3));
        c2.setText(rs.getString(4));
        c3.setText(rs.getString(5));
        c4.setText(rs.getString(6));
    }
    

    而且每次点击提交时,都会显示之前检索到的ResultSet的下一个结果。

    这也将提供更好的性能,因为每次单击提交时都不会执行 select 语句。

    【讨论】:

    • 只需将 String sq、Statement st、ResultSet rs 的声明添加到类的顶部,而不是添加到侦听器方法中。然后,以与构造函数 Abc 相同的方式为它们赋值。最后,在您的听众中将 while 改为 if。
    • 我无法做到,请在 raghvendra972@gmail.com 发送完整代码
    【解决方案2】:

    ResultSet 的每次迭代都会重置JTextArea 组件中的文本。你可以这样做

    jTextArea1.append(rs.getString(2) + System.getProperty("line.separator"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2016-03-18
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多