SQLException: метод executeQuery не может использоваться для обновления

Я пытаюсь вставить информацию пользователя из регистрационной формы в Derby DB с использованием класса сервлета Java.

Я подключаюсь к БД на NetBeans сразу после того, как пользователь нажимает кнопку отправки с заполненной пользовательской информацией. Затем он должен запустить этот метод:

public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) {
    try {
        stmt = conn.createStatement();
        String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')";
        System.out.println(insertNewUserSQL);
        stmt.executeQuery(insertNewUserSQL);
        stmt.close();
    } catch(SQLException sqlExcept) {
        sqlExcept.printStackTrace();
    }
}

Но я продолжаю получать следующее исключение:

java.sql.SQLException: executeQuery method can not be used for update.

Что это значит?

Команда SQL верна, так как я могу сделать это вручную в окне командной строки NetBeans.

Существуют ли ограничения для сервлетов или чего-то, о чем я не знаю?

Спасибо заранее!

Ответ 1

Поскольку вы вставляете запись, вы должны использовать executeUpdate() not executeQuery().

Вот некоторые методы, которые обычно используются неправильно:


boolean execute()

Выполняет инструкцию SQL в этом объекте PreparedStatement, что может быть любым выражением SQL.

ResultSet executeQuery()

Выполняет SQL-запрос в этом объекте PreparedStatement и возвращает объект ResultSet, сгенерированный запросом.

int executeUpdate()

Выполняет инструкцию SQL в этом объекте PreparedStatement, который должен быть инструкцией SQL INSERT, UPDATE или DELETE; или оператор SQL который ничего не возвращает, например, оператор DDL.


Еще одна вещь: ваш запрос слабый, поскольку он уязвим с помощью SQL Injection. Пожалуйста, выполните параметрирование с помощью PreparedStatement.

Пример фрагмента кода:

String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL);
pstmt.setString(1, userName);
// ... repeat this step until the last parameter ....
pstmt.setString(7, email);
pstmt.executeUpdate();

Ответ 2

Чтобы обновить значения, вам необходимо использовать обновляемый ResultSet, как показано ниже:

ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
res.first();
res.updateInt("id", 2);
res.updateRow();

В качестве альтернативы вы можете использовать метод executeUpdate для оператора: statement.executeUpdate("update table set id = 2");