Сохраните LocalDateTime в столбце DB2 TIMESTAMP - PullRequest
1 голос
/ 29 февраля 2020

Я пытался сохранить LocalDateTime в столбце TIMESTAMP в DB2 10.5, но завершился неудачно с ошибкой:

[jcc] [1091] [10824] [4.26.14] Неверные данные преобразование: экземпляр параметра 2020-01-02T12: 34: 56 недопустим для запрошенного преобразования. ERRORCODE = -4461, SQLSTATE = 42815

Я использую драйвер IBM JDB C: «Драйвер JDB C Драйвер IBM Data Server для JDB C и SQLJ 4.26.14» который реализует JDB C spe c 4.1.

Определение таблицы:

create table t1 (
  id int,
  a timestamp
);

И код Java:

LocalDateTime dt = LocalDateTime.of(2020, 1, 2, 12, 34, 56);
PreparedStatement ps = conn.prepareStatement(
  "insert into t1 (id, a) values (?, ?)"
);
int id = 1;
ps.setInt(1, id);
ps.setObject(2, dt); // fails here
ps.execute();

I можно увидеть, что он даже не доходит до метода ps.execute(). Я читал, что драйвер JDB C 4.2 может это исправить, но я нигде не могу его найти.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

В соответствии с типами данных, которые сопоставляются с типами данных базы данных в Java приложениях topi c, следует использовать java.sql.Timestamp, работая с TIMESTAMP столбцом таблицы.

Таблица 1. Отображения типов данных Java на типы данных сервера базы данных для обновления таблиц базы данных

Java data type      Database data type
------------------  ------------------
...
java.sql.Timestamp  TIMESTAMP, ...
1 голос
/ 29 февраля 2020

Измените код для использования setTimestamp(...), используя Timestamp.valueOf(LocalDateTime dateTime):

ps.setTimestamp(2, Timestamp.valueOf(dt));

Если dt может быть нулевым, используйте троичный оператор:

ps.setTimestamp(2, (dt == null ? null : Timestamp.valueOf(dt)));
...