Как вставить значения в базу данных mysql, если один из столбцов автоматически увеличивается с помощью подготовленного оператора

#java #mysql #jdbc #prepared-statement #sqlexception

#java #mysql #jdbc #подготовленный оператор #sqlexception

Вопрос:

 public String put(){
         this.query = "INSERT INTO user_registration VALUES('default', '?' , '?' , '?' , '?' , '?' );";

    try {
        PreparedStatement stmt= Main.connection.prepareStatement(query);
        stmt.setString(1,this.fullname);
        stmt.setString(2,this.username);
        stmt.setString(3,this.password);
        stmt.setString(4,this.email);
        stmt.setString(5,this.contact);
        stmt.executeUpdate();
        return String.valueOf(SignupStatus.SUCCESS);
    } catch (SQLException e) {
        e.printStackTrace();
        System.out.println(e);
        return String.valueOf(SignupStatus.FAILED);
    }
}
  

Я получаю это исключение:

 java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1372)
    at com.mysql.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1385)
    at com.mysql.cj.jdbc.ClientPreparedStatement.setString(ClientPreparedStatement.java:1752)
    at client_sharenow.Signup.put(Signup.java:29)
    at client_sharenow.Client_Request.run(Client_Request.java:40)
    at java.base/java.lang.Thread.run(Thread.java:832)
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
  

Пожалуйста, помогите мне исправить код.

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

1. Я считаю, что вопросительные знаки (параметры) в вашей строке SQL не должны иметь кавычек рядом с ними.

2. ‘?’ будет обрабатываться как значение вместо заполнителя. Поэтому попробуйте удалить ‘ ‘.

Ответ №1:

? Заполнители не должны быть заключены в одинарные кавычки.
Также рекомендуется включать в свой оператор имена столбцов, которые будут получать каждое из предоставленных значений.
Если 1-й столбец является столбцом автоматического увеличения, вам следует исключить его из списка, потому что его значение будет предоставлено MySQL:

 this.query = "INSERT INTO user_registration(fullname, username, password, email, contact) VALUES (?, ?, ?, ?, ?);";
  

Измените имена столбцов на фактические.

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

1. Следует также отметить, что добавление '' сбивает с толку PreparedStatement, что заставляет его думать, что вы на самом деле собираетесь вставить ‘?’ в этот столбец

2. но теперь я получаю другое исключение: ( это имя пользователя не может быть null . можете ли вы мне в этом помочь?

3. Если вы определили имя пользователя столбца как NOT NULL , вы должны указать ненулевое значение для this.username .

4. @alupi07 отлично, если это решено, и не забудьте принять ответ, нажав на галочку