java - 在 jdbc 应用程序中向前移动 rs.next()

标签 java swing jdbc

我正在开发一个在线考试软件,该软件使用 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);

    }

}

最佳答案

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

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,将这些变量声明为类的公共(public)变量并在构造函数中初始化它们:

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 语句。

关于java - 在 jdbc 应用程序中向前移动 rs.next(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26387444/

相关文章:

java - 如何打印数组

java - 当我创建的类需要一个 int 数组时,我如何传递一个 String 数组(包含 : , 字母、数字和空格)?

java - JLayeredPane 不更新 JLabel 的移动

Java桌面应用程序: How to fix height and width

java - 数据在 **Result.next()** 循环中被覆盖

java - 如何将 Java ArrayList 插入到 MySQL 表中?

java - 带有 JMS 队列的同步消费者

java - 编译问题: Unreachable statement

java - 鼠标适配器的范围

java - JDBC 连接问题