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