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");