为什么 ResultSet API 会抛出“SQLException: Illegal operation on empty result set”?

问题描述

我正在向我的项目添加一个基本的登录表单,它给了我这个错误 java.sql.sqlException: Illegal operation on empty result set。"用户名或密码与MysqL 数据库中的数据。

如果我检查结果集是否为空,则该 if 语句中的代码不起作用。但是,我的代码在没有 if 语句的情况下运行良好。

请找到下面的代码部分

String studentNumber = userText.getText();
String password = String.valueOf(passtext.getpassword()); 

String executeQuery = "select * from login where studentNumber='"+studentNumber+"' and password ='"+password+"'" ;
ResultSet rSet = connObject.queries.executeQuery(executeQuery);// stores result of query

if(!rSet.next()){
    JOptionPane.showMessageDialog(null,"Student Number/ Password not found :(");
}
if(studentNumber.equals(rSet.getString("studentNumber"))){
    if(password.equals(rSet.getString("password"))){
        JOptionPane.showMessageDialog(null,"you are Now logged in :)");

        loginFrame.setVisible(false);
        new operationClass();
    }else{
        JOptionPane.showMessageDialog(null,"password not found :(");
    }
}

解决方法

next() 有副作用,你不能叫它两次

您需要只调用一次,然后如果它返回 false,则做一件事,如果 true,则做另一件事。您只需要使用 else,而不是注释掉的代码。

此外,请使用 bcrypt 或其他密码哈希,不要将密码放入数据库中。此外,连接和结果集需要受保护的尝试资源。此外,您的应用不安全(存在 SQL 注入攻击)。

注意:只是为了避免“但这只是为了学校”。好吧,你告诉我:学习愚蠢的安全实践有什么意义?您可以在网络上搜索这些术语(“SQL 注入攻击”、“密码哈希”、“bcrypt”等)。您将了解重要信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...