Число не записывается в БД при запросе через PreparedStatement

Рейтинг: -2Ответов: 1Опубликовано: 01.06.2023

Мне необходимо занести число в ячейку.

Вот только почему-то информация не заносится в БД.

Подскажите, в чем может быть дело?

private void SignUpDuuNasPDOALL(Date date, String str, Integer num) {
    String insert = "UPDATE " + ConstDUUPDO.PDO_TABLE_NAS_HARD + " SET " + str + "=?" + " WHERE DATE(" + ConstDUUPDO.DATEPDO_NH + ") = '"+ date +"'";
    try {
        PreparedStatement prSt = getDbConnection().prepareStatement(insert);
        prSt.setInt(1, ConstHrono.ADZ_DUU2M_HARD);
        prSt.executeUpdate();
        System.out.println("Занесено в " + num + " ячейку");
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

Ответы

▲ 0Принят

Проблема скорее всего в том, что формально синтаксис SQL запроса не нарушен, но условие WHERE выполняться не будет из-за неправильного ожидания, что переменная Date date будет автоматически представлена в ISO формате yyyy-MM-dd.

Такой формат используется по умолчанию для класса java.sql.Date:

public String toString()
Formats a date in the date escape format yyyy-mm-dd.

в отличие от класса java.util.Date:

public String toString()
Converts this Date object to a String of the form:
dow mon dd hh:mm:ss zzz yyyy


Вероятно, вам следовало использовать другой параметр в PreparedStatement для установки даты вместо кодирования строки при помощи метода PreparedStatement::setDate(int pIx, java.sql.Date date).

Кроме того, параметр num нигде НЕ используется при формировании запроса на обновление, а только при выводе сообщения.

Также при работе с PreparedStatement следует использовать try-with-resources, чтобы гарантировать его закрытие.

import java.sql.Date;

private void SignUpDuuNasPDOALL(Date date, String str, Integer num) {
    String insert = String.format("UPDATE %s SET %s = ? WHERE DATE(%s) = ?",
        ConstDUUPDO.PDO_TABLE_NAS_HARD, str, ConstDUUPDO.DATEPDO_NH
    );
    try (PreparedStatement prSt = getDbConnection().prepareStatement(insert)) {
        prSt.setInt(1, ConstHrono.ADZ_DUU2M_HARD); // не num!
        prSt.setDate(2, date);
        int rowsUpdated = prSt.executeUpdate();
        System.out.println("Для ячейки " + num + " обновлено строк: " + rowsUpdated);
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}