org.h2.jdbc.JdbcSQLDataException: ошибка преобразования данных, преобразующая «‘МЕСЯЦ'»; Оператор SQL:

#java #sql #h2

#java #sql #h2

Вопрос:

При попытке вставить в базу данных с помощью подготовленного оператора возникает ошибка. Я пытаюсь добавить к текущей дате, чтобы создать новую дату истечения срока действия, используя функцию DateAdd в моей встроенной базе данных H2.

         PreparedStatement sql = c.prepareStatement("INSERT INTO BLOOMHEALTH.CLIENTS VALUES ( ?,?,?,?,?,DATEADD(?,?,?),?,?,?)");
        String mem = bloomClient.getSsMember();
        try {
            sql.setString(1,bloomClient.getFirstName());
            sql.setString(2,bloomClient.getLastName());
            sql.setString(3,bloomClient.getPhoneNumber());
            sql.setString(4,bloomClient.getBirthday());
            sql.setString(5,bloomClient.getStartDate());
            sql.setString(6,text);
            sql.setInt(7,num);
            sql.setString(8,systemDate());
            sql.setInt(9,bloomClient.getSessionAmount());
            sql.setString(10,bloomClient.getTrainer());
            sql.setString(11,bloomClient.getSsMember());// problem here aswell, says invalid parameter(unsure why)
            sql.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }
 

Точное исключение :

org.h2.jdbc.JdbcSQLDataException: ошибка преобразования данных при преобразовании «МЕСЯЦА»; Инструкция SQL: ВСТАВИТЬ В BLOOMHEALTH.ЗНАЧЕНИЯ КЛИЕНТОВ ( ?,?,?,?,?,DATEADD(?,?,?),?,?,?) — (?1, ?2, ?3, ?4, ?5, ДАТА ДОБАВЛЕНИЯ(«, ?6, ?7), ?8, ?9, ?10) [22018-200]

Вот что отправляется для данных для инструкции SQL.

         weeks.setText("'WEEK'");
        months.setText("'MONTH'");
 

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

1. может быть лишним, что вы включаете в свой текст в качестве параметра? например, «НЕДЕЛЯ»

2. Месяцы, возможно, должны быть допустимым именем месяца

Ответ №1:

Последние версии H2 больше не поддерживают параметризацию единиц измерения даты и времени в этой функции, поскольку это вызвало другие проблемы. К сожалению, H2 1.4.200 выдает странное исключение вместо фактического, эта проблема была исправлена после этого выпуска.

Вам необходимо напрямую указать единицу измерения даты и времени ( DATEADD(MONTH, ?, ?) ). Если вам нужно поддерживать несколько единиц, вы можете использовать регистр:

 INSERT INTO BLOOMHEALTH.CLIENTS VALUES (?1, ?2, ?3, ?4, ?5,
CASE ?6
    WHEN 'MONTH' THEN DATEADD(MONTH, ?7, ?8)
    WHEN 'WEEK' THEN DATEADD(WEEK, ?7, ?8)
    -- put all additional units here
END
?9, ?10, ?11)
 

Вам также необходимо использовать setText("MONTH") вместо "'MONTH'") (или вы можете использовать 'MONTH' в случае с WHEN '''MONTH''' THEN … ).