Результирующий набор всегда возвращает пустой, я не должен использовать executeQuery () на моем подготовленном утверждении? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть пользователи, пытающиеся зарегистрироваться на сайте. прежде чем они смогут зарегистрировать свое имя пользователя, поиск выполняется в базе данных SQL, чтобы убедиться, что его еще не существует. проблема в том, что имена никогда не ищутся, потому что ResultSet всегда возвращает пустое значение. Я думаю, что это подготовленное заявление.

Я думаю, что мое подготовленное заявление не выполняется. Я использую executeQuery(), чтобы выполнить свое утверждение, потому что именно так я без проблем вставляю имена пользователей. Я получил часть результатов поиска if (rs.next())... из метода, который вставляет имена пользователей. То же самое с String SQL и подготовленным оператором.

String SQL = "SELECT * FROM users WHERE username='" + getUsername() + "'";

    System.out.println(SQL);
    // prints out SELECT * FROM users WHERE username='whatever I searched'
    // so this String is valid
    if (db.getConn() != null){
        System.out.println("connected to database");
        // always prints
    }
    PreparedStatement preparedStatement = db.getConn().prepareStatement(SQL);
   // preparedStatement.setString(1, getUsername());
    ResultSet rs = preparedStatement.executeQuery();
//    userNameCounter = rs.getString("username");
    // putting this here returns an sqlexception. empty set
if (preparedStatement != null){
        System.out.println("ps != null");
        // prints this
    }
    if (rs != null){
        System.out.println("rs != null");
        // prints this
    }
    if (!rs.next()){
        System.out.println("!rs.next");
        // prints this
    }
    if (rs.next()) {
        userNameCounter = rs.getString("username");
        System.out.println("rs.next()");
        // doesn't print
        // so the resultset is empty

        if (!userNameCounter.equals(getUsername())) {
            System.out.println("that username is unique");
            return true;
        }
    }
    preparedStatement.close();
    incorrectLabels.setText("That username is already taken");
    incorrectLabels.setVisible(true);
    System.out.println("that username is already there");
    // this always prints. it shouldn't
    return false;

Так что executeUpdate() требует int, но я не уверен, что бы я туда поместил. И просто execute() выдает ошибку Requires ResultSet found boolean. Я не думаю, что есть какие-либо синтаксические ошибки, так как таблица называется users. Все, что я пробую, просто возвращает меня к ошибке, возникающей из-за пустого набора. дайте мне знать, если вам нужно больше кода, но именно здесь происходит ошибка.

Спасибо!

1 Ответ

2 голосов
/ 05 апреля 2019

Вы отправляете запрос к базе данных при использовании оператора SELECT, поэтому вы используете метод executeQuery ().

Что сбивает с толку, так это переменная userNameCounter , которую вы используете.Где это объявлено и как оно объявлено?Похоже, что это может быть целочисленная переменная, которая заставит меня спросить .... что, по вашему мнению, возвращает метод rs.getString ("username")?На самом деле ... что со всеми условиями rs.next () для всех этих if операторов?

Все это довольно запутанно.Если вы хотите узнать, существует ли имя пользователя в таблице базы данных, вы можете сделать это примерно так:

if (db.getConn() == null){
    throw new RuntimeException("Method Error! You Are NOT Connected To Database!");
}

String suppliedUserName = getUsername();
String dbUserName = "";
String SQL = "SELECT username FROM users WHERE username=?";

PreparedStatement preparedStatement = db.getConn().prepareStatement(SQL);
preparedStatement.setString(1, suppliedUserName);
ResultSet rs = preparedStatement.executeQuery();

while (rs.next()) {
    dbUserName = rs.getString("username");
}
rs.close()
preparedStatement.close()

/* Below we use the equalsIgnoreCase() method. You 
   don't want a supplied User Name to be that close 
   or that similar to another User Name already in 
   Database. If you do then just use equals() method.  */
if (dbUserName.equalsIgnoreCase(suppliedUserName)) {
    System.out.println("The User name (" + suppliedUserName + 
                ") is already in use. Try another User Name.");
    return false;
}
else {
    System.out.println("The User name (" + suppliedUserName + ") is Unique.");
    return true;
}

Конечно, этот код не проверен, и я предполагаю, что у вас есть попробуйте / поймайте на месте для обработки любого SQLException .Я просто предоставляю этот код, чтобы дать вам представление о том, как его можно выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...