2014-11-21 105 views
2

当我试图做的是:java.sql.SQLException:对空结果集进行非法操作。验证

  1. 接受用户名信息(uname)和密码(PASSW)作为来自用户的输入。

  2. 使用ResultSet,检索唯一元组,数据库中的用户名和用户提供的用户名适合该元组。这个元组将包含用户名和密码。

  3. 如果用户给出的密码也适合数据库中的密码,则显示两个信条都正确的信息,否则其中一个是错误的。

一切工作正常,除了在一种情况下。当用户名本身是错误的,MySQL不会找到的所有属性,并给这个错误:java.sql.SQLException: Illegal operation on empty result set.

的代码是:

ok.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      String uname=jf1.getText(); 
      String passw=jf2.getText(); 
      String n; 
      String m; 
      try 
      { 
       Class.forName("com.mysql.jdbc.Driver").newInstance(); 
       Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/authentication?" + "user=root&password=letmein"); 
       PreparedStatement stmt=conn.prepareStatement("Select * from admin where id = ?"); 
       stmt.setString(1,uname); 
       ResultSet rs=stmt.executeQuery(); 
       rs.next(); 
       n=rs.getString("id"); 
       m=rs.getString("pass"); 
       conn.close(); 
       if(n.equalsIgnoreCase(uname) && m.equalsIgnoreCase(passw)) 
       { 
        JOptionPane.showMessageDialog(null,"Username and password is correct"); 
       } 
       else 
       { 
        JOptionPane.showMessageDialog(null,"Username or password is not correct"); 
       } 

      } 
      catch(Exception ex) 
      { 
        System.out.println(ex); 
      } 
     }//end of actionperformed 
    });//end of actionlistener 

有什么办法,我可以在同一时间做这两个操作(在关闭与数据库的连接之前)?如果不是,那么替代方法是什么?

回答

5

你应该使用的rs.next()结果:

  if (rs.next()) { 
       n=rs.getString("id"); 
       m=rs.getString("pass"); 
      } 

如果rs.next()返回false,这意味着该查询返回任何行。

+0

工作完美谢谢。 – learner 2014-11-21 10:15:12

1

@Eran提到了一个错误,通过这个错误,一个错误的id会产生一个空字段被获取的结果集。

我仍然有小备注:

  • 尝试 - 与资源需要,即使在异常或返回的情况下关闭的照顾。
  • 对于本地数据库,您可以将密码发送到SQL。
  • 最好存储密码encrypted,当你的数据库应该被盗。

这样:

boolean loggedIn = false; 
try (PreparedStatement stmt = 
     conn.prepareStatement("SELECT 1 FROM admin WHERE id = ? AND pass = PASSWORD(?)")) { 
    stmt.setString(1, uname); 
    stmt.setString(2, passw); 
    try (ResultSet rs = stmt.executeQuery()) { 
     loggedIn = rs.next(); 
    } // Closes rs. 
} // Closes stmt. 
+0

我不知道试用资源,并以加密形式存储密码。感谢您提供更好的想法。 – learner 2014-11-21 11:33:17