0

我试图编写一个搜索学生数据库并在选项窗格上显示搜索结果的代码。我最终写了以下内容。预期结果是:

姓名:“某事” 卷:“某事” 注册:“某事”

但实际上输出是这样的:

姓名:空卷:空注册:空


public class Search

{

JFrame sw = new JFrame("Search Students' Info");   //search window
JTable stable;
JLabel stfl = new JLabel("Roll");                  //search text field label
JTextField stf = new JTextField(8);               //search text field


JButton sb = new JButton("Search");             //search button

public void exsearch()                              //Execute Search
{
    sw.setLayout(new GridLayout(2,2));
    sw.add(stfl);
    sw.add(stf);
    sw.add(sb);


    sw.setSize(200, 100);
    sw.setLocation(100, 100);
    sw.setVisible(true);

    sb.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://localhost/srsdb";
            try
            {
                Class.forName(driver).newInstance();

                java.sql.Connection con = DriverManager.getConnection(url, "root", "");
                JOptionPane.showMessageDialog(null, "Connected", "Connection Confirmation", JOptionPane.PLAIN_MESSAGE);

                String str ="SELECT* FROM students WHERE Roll="+stf.getText();
                java.sql.Statement st = con.createStatement();
                java.sql.ResultSet rs = st.executeQuery(str);

                rs.first();

                int n = rs.getMetaData().getColumnCount();
            //  String[] columnnNames;
                String[] attributes= new String[10];

                int j;

                while(rs.next())
                {
                    for(j=0; j<3; j++)
                    {
                        attributes[j] = rs.getString(j);
                    }
                }
                    JOptionPane.showMessageDialog(null, "Name :"+attributes[0]+"\nRoll :"+attributes[1]+"\nRegistration :"+attributes[2], "Search Result", JOptionPane.PLAIN_MESSAGE);
            }
        catch(Exception f)
        {
            f.printStackTrace();
            JOptionPane.showMessageDialog(null, "Not Found", "Search Result", JOptionPane.PLAIN_MESSAGE);
        }   

    }});


}

public static void main (String[] args)
{
    new Search();
}

}

4

2 回答 2

0

我会使用调试器来检查代码的哪一部分被省略。我看到的一件奇怪的事情是,您跳转到结果集中的第一条记录:

rs.first();

然后你在一个while循环中从所有后续记录中读取数据

 while(rs.next())
 {
    for(j=0; j<3; j++)
    {
        attributes[j] = rs.getString(j);
    }
 }

如果有多个匹配记录,这可以确保您从最后一个匹配记录中获取数据。最好检查是否有零个或多个记录。如果是这种情况,请发出警告,因为您的代码可能有问题(使用调试器找出问题所在)。如果只有一条记录,则从该记录中读取数据并打印(或多或少就像您尝试使用 rs.getString() 一样)

于 2013-07-22T11:00:38.340 回答
0
  1. Class.forName 确保驱动程序类位于类路径上,而无需针对该类进行编译。它加载类。不需要实例化。
  2. PreparedStatement 更适合SQL 注入
  3. SQL API 中的列号是从 1 开始的:1, 2, 3, ...有点例外。
  4. 使用first查询循环时如下。你跳过了我认为的第一行。
  5. 不要忘记杂项close()
  6. 列出列而不是“*”的更好的样式。

因此:

        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost/srsdb";
        try
        {
            Class.forName(driver);

            Connection con = DriverManager.getConnection(url, "root", "");
            JOptionPane.showMessageDialog(null, "Connected",
                "Connection Confirmation", JOptionPane.PLAIN_MESSAGE);

            String str ="SELECT Name, Registration FROM students WHERE Roll=?";
            PreparedStatement st = con.createPreparedStatement(str);

            String roll = stf.getText();
            st.setString(1, roll);

            String message = "";
            java.sql.ResultSet rs = st.executeQuery();            
            int recno = 0;    
            if (rs.first()) {
                do {
                    String name = rs.getString(1);
                    String registration = rs.getString(2);
                    ++recno;
                    message += "- " + recno + " -\nName: " + name
                        + "\nRoll: " + roll
                        + "\nRegistration: " + registration + "\n";
                } while (rs.next());
            }
            rs.close();

            JOptionPane.showMessageDialog(null, message, "Search Result",
                JOptionPane.PLAIN_MESSAGE);
于 2013-07-22T11:22:25.450 回答