如何将字符串传递给JOptionPane?

时间:2013-07-15 17:06:31

标签: java swing jtable joptionpane

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

  

姓名:“某事”   卷:“东西”   注册:“Something”

但实际输出是这样的:

  

名称:null   Roll:null   注册:null


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();
}

}

2 个答案:

答案 0 :(得分:0)

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

rs.first();

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

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

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

答案 1 :(得分:0)

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

            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);