Operation not allowed after ResultSet closed
Код метода отрабатывает нормально, но еще и выводит "Operation not allowed after ResultSet closed". На stackoverflow есть такее вопросы и они уже решенные. Но я что-то не так делаю, и оно не работает :) Код должен брать количество одного продукта из бд и увеличивать его на то количество, которое напишет пользователь. Как избавиться от "Operation not allowed after ResultSet closed"
Вообщем и целом, вот код:
if (searchedCategory) {
Statement statementUpdate = connection.createStatement();
sql = "select * from snacks where category='" + categoryFromUser + "'";
ResultSet rsUpdate = statementUpdate.executeQuery(sql);
// add an additional amount
while (rsUpdate.next()) {
int amountFromTable = rsUpdate.getInt("amount");
double priceFromTable = rsUpdate.getDouble("price");
String formattedPrice = String.format("%.2f", priceFromTable).replace(",", ".");
int amountRes = amountFromTable + amountFromUser;
sql = "update snacks " +
"set amount=" + amountRes + " where category='" + categoryFromUser + "'";
statementUpdate.executeUpdate(sql);
System.out.println(categoryFromUser + " " + formattedPrice + " " + amountRes);
}
rsUpdate.close();
statementUpdate.close();
} else {
System.out.println("There is no such category in the list :( \n" +
"First, add your \"" + categoryFromUser + "\" using the addCategory command");
}
Как избавиться от "Operation not allowed after ResultSet closed"?
Ответы (2 шт):
Вот этот код надо убрать или перенести за цикл
sql = "update snacks " +
"set amount=" + amountRes + " where category='" + categoryFromUser + "'";
statementUpdate.executeUpdate(sql);
Нельзя использовать один и тот же statement для разных запросов одновременно. Сначала надо закрыть текущий, а потом только возможно переиспользовать его.
Можно создать новый statement, но лучше обновлять таблицу после ее чтения.
Лучше всего делать прямое изменение в БД, не вычитывая данные.
if (searchedCategory) {
String sql = "UPDATE snacks SET amount = amount + ? WHERE category = ?";
try (PreparedStatement updateStatement = connection.prepareStatement(sql)) {
updateStatement.setInt(1, amountFromUser);
updateStatement.setString(2, categoryFromUser);
updateStatement.executeUpdate();
}
}
Лучше использовать PreparedStatement (как в коде выше) и не строить запрос вручную из кусочков текста, так как это опасно.
А ошибка возникает, скорее всего, на второй итерации цикла на шаге rsUpdate.next(), т.к выполнение executeUpdate закрывает существующий ResultSet.