#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 …
).