【问题标题】:validating JTextField data from result set从结果集中验证 JTextField 数据
【发布时间】:2013-04-29 11:06:50
【问题描述】:

我正在尝试设置一个登录系统,当用户输入他的用户名和密码并按下登录按钮时,他的用户名和密码将在 SQL 语句中发送,以与数据库中的用户匹配。如果用户名和密码正确(如果它们在数据库中匹配),则使用数据库中的所有用户数据创建一个用户对象,并将用户带到管理仪表板

在对结果集等进行了大量研究并编写了大量代码之后,我仍然无法使其在我的系统中运行。谁能告诉我这样做的好方法?或者告诉我这段代码是否有明显的问题?

当我输入用户名和密码并按登录时,我在控制台中收到错误:

java.sql.SQLException: Invalid column index
    at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5321)
    at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:5309)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.java:280)
    at database.UserOperations.validateLog(UserOperations.java:45)
    at gui.Login$2.mouseClicked(Login.java:77)

部分 gui 代码

    JButton btnLogin = new JButton("Login");
    btnLogin.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {

            UserOperations userOperations = new UserOperations();

            ResultSet rset = userOperations.validateLog(textFieldUsername.getText(), textFieldPassword.getText());
            User user = null;
            try {
                if (rset.next()) {
                    user = new User(rset.getInt("userID"), rset.getString("userName"), rset.getString("userPassword"), rset.getString("securityQuestion"), rset.getString("securityAnswer"),
                        rset.getInt("adminRights"), rset.getString("email"), rset.getString("fName"), rset.getString("phoneNumber"), rset.getString("department"));

                    dispose();
                    AdminDashboard admin = new AdminDashboard();
                    admin.setVisible(true);

                }
                else{

                    JOptionPane.showMessageDialog(null, "Login fail!", "Error", JOptionPane.WARNING_MESSAGE);
                }
            } catch (SQLException e2) {
                e2.printStackTrace();
            }

        }
    });

validateLogin() 方法

   public ResultSet validateLog(String username, String userpassword)
{
    try {
        String sql = "SELECT userid, username, userpassword, securityquestion, securityanswer, adminrights, email, fname, phonenumber, department FROM systeuser WHERE username = ? AND userpassword = ?";

        stmt = conn.prepareStatement(sql);
        stmt.setString (2, username);
        stmt.setString (3, userpassword);
        rset = stmt.executeQuery ( );

    }
    catch(Exception e){
        e.printStackTrace ( );
        JOptionPane.showMessageDialog (null, "Login Failed", null, JOptionPane.WARNING_MESSAGE);
    }
    return rset;

}

【问题讨论】:

    标签: java swing jdbc sqlexception


    【解决方案1】:

    试试小写:

    user = new User(rset.getInt("userid"), rset.getString("username"), 
        rset.getString("userpassword"), rset.getString("securityquestion"), 
        rset.getString("securityanswer"), rset.getInt("adminrights"), 
        rset.getString("email"), rset.getString("fname"),
        rset.getString("phonenumber"), rset.getString("department"));
    

    而不是混合大小写:

    user = new User(rset.getInt("userID"), rset.getString("userName"), 
        rset.getString("userPassword"), rset.getString("securityQuestion"), 
        rset.getString("securityAnswer"), rset.getInt("adminRights"), 
        rset.getString("email"), rset.getString("fName"),
        rset.getString("phoneNumber"), rset.getString("department"));
    

    另外,改变这个:

    stmt = conn.prepareStatement(sql);
    stmt.setString (2, username);
    stmt.setString (3, userpassword);
    

    到这里:

    stmt = conn.prepareStatement(sql);
    stmt.setString (1, username);
    stmt.setString (2, userpassword);
    

    【讨论】:

    • @Craig Hogan 进行上述更改
    • 这行得通。我不知道该怎么感谢你才足够!已经为此工作了几个小时。我会投票给你,但我没有足够的声誉,道歉!
    【解决方案2】:
    systeuser
    

    你的表名对吗?

    【讨论】:

    • stmt.setString (2, username); stmt.setString (3, userpassword); 为什么是 2 和 3?不应该是1和2吗?
    • 是的,它现在正在使用 1 和 2。虽然我认为这些是列数?在我的数据库中,第 1 列是用户 ID,第 2 列是用户名,第 3 列是用户密码。见图片:gyazo.com/0b3505f3dc10b4d169a095c91fbca994.png
    • 很高兴它现在可以工作了。似乎上面的印都偷走了我的答案,但没关系:D
    • 非常感谢您的意见 :) 再次,很遗憾,我无法为您的答案投票,因为我没有足够的声誉
    猜你喜欢
    • 2017-07-20
    • 2014-04-12
    • 2012-12-31
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多