Ошибка при проверке имени пользователя и пароля

#java #sql

#java #sql

Вопрос:

В настоящее время я пытаюсь создать систему входа в систему на Java и SQL и в настоящее время получаю сообщение об ошибке.

 PreparedStatement s1 = con.prepareStatement("SELECT * FROM dbo.Logins WHERE Username=? AND Password=?");
s1.setString(1,loginUsername);
s1.setString(2, loginPassword.toString());
ResultSet rs = s1.executeQuery();

if(rs.next()){
    JOptionPane.showMessageDialog(null, "User Found");
}
else{
    JOptionPane.showMessageDialog(null, "Error");
}
  

Когда я запускаю этот фрагмент кода, он всегда отображает else часть if / else, и я не уверен, почему. Заранее благодарю.

Редактировать: Да, база данных заполнена пользователями. Правка 2: Я изменил функцию, чтобы она требовала двух строковых аргументов.

Комментарии:

1. это просто означает, что совпадение не найдено, вы уверены, что сохранили данные в DB

2. Я могу распечатать таблицу на консоль, поэтому она определенно сохранена.

3. Почему вы используете loginUsername напрямую, но loginPassword.toString() не loginPassword напрямую?

4. Я использую loginPassword.toString() , потому что пароль вводится в поле пароля и сохраняется как char[]

Ответ №1:

Вы можете получить количество строк, доступных в вашей таблице для данного запроса, и если оно больше 0, он выполнит инструкцию User Found.

 PreparedStatement s1 = con.prepareStatement("SELECT * FROM dbo.Logins WHERE Username=? AND Password=?");
s1.setString(1,loginUsername);
s1.setString(2, loginPassword.toString());
ResultSet rs = s1.executeQuery();

int rowCount = rs.last() ? rs.getRow() : 0; //Number of rows available in table for query

if(rowCount>0)
    JOptionPane.showMessageDialog(null, "User Found");
}
else{
    JOptionPane.showMessageDialog(null, "Error");
}
  

Комментарии:

1. Можете ли вы объяснить, что вы здесь изменили и почему? Ответ не очень полезен без некоторых сопроводительных описаний.

2. @nbrooks обновил мой ответ. rs.next () всегда возвращает «выбрать …». Вопрос в том, больше ли количество, чем ноль. Итак, для этого я использовал rowCount.

3. получил это com.microsoft.sqlserver.jdbc.SQLServerException: запрошенная операция не поддерживается в наборах результатов только для пересылки.

Ответ №2:

Вы должны попытаться использовать while(rs.next()) вместо if(rs.next()) .

Если это не работает, содержит ли ваша база данных (о которой вы упомянули, заполнена) те конкретные значения имени пользователя и пароля, которые вы ищете? Если нет, то это может быть проблемой.

Если это тоже не работает, возможно, вы закрыли некоторые объекты (например, s1.close () или con.close () ) там, где не следовало. Для получения дополнительной помощи по этому вопросу вам нужно будет предоставить более подробное описание того, что вы сделали во всем коде.

Комментарии:

1. добавлено while (rs.next()) вокруг оператора if, и теперь ни одно всплывающее окно не появляется. Я поместил его не в то место или это другая ошибка

2. попробуйте использовать while вместо if ()

3. попробовал цикл while, ничего не получил, и база данных содержит логин, который я использую.

4. Тогда опубликуйте весь код, пожалуйста. Возможно, вы закрыли некоторые объекты, где, как я предполагаю, вы не должны.

Ответ №3:

 public void Login(String user, String pass) throws ClassNotFoundException, SQLException{
        try{
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            MainWindow mw = new MainWindow();
            String userName = "<USERNAME>";
            String password = "<PASSWORD>";
            String url = "<URL>";
            Connection con = DriverManager.getConnection(url, userName, password);
            PreparedStatement s1 = con.prepareStatement("SELECT * FROM dbo.Logins WHERE Username=? AND Password=?");
            s1.setString(1,user);
            s1.setString(2, pass);
            ResultSet rs = s1.executeQuery();           

            //int rowCount = rs.last() ? rs.getRow() : 0; //Number of rows
            System.out.println("Name: "   user   "nPass: "   pass);

            if(rs.next())
                JOptionPane.showMessageDialog(null, "User Found");

            else{
                JOptionPane.showMessageDialog(null, "Error");
            }
            con.close();