Я работаю над Java-приложением (GUI, JDBC, MySQL), и у меня возникла проблема, которую я не могу решить.
Когда я вставляю данные в базу данных MySQL (есть этот тип данных String, INT, Date), нет проблем, если некоторые поля пусты. Эти пустые поля получают Null в БД. Но когда я хочу обновить какую-то строку, все поля даты должны быть заполнены, иначе это ошибка:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'rociste_datum' at row 1
rociste_datum - первый столбец даты в БД
Есть части кода:
Код для метода вставки
public void insertPredmetDB(String prezime, String ime, int nasBroj, Date datumRocista) {
if (datumRocista == null || datumRocista.equals("")) {
datumRocistaDB = null;
} else {
String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(datumRocista);
datumRocistaDB = java.sql.Date.valueOf(datumRocistaSt);
}
Код для метода обновления
public void updatePredmetDB(int idNovo, String novoPrezime, String novoIme, int noviNasBroj, Date noviRocisteDatum) {
if (noviRocisteDatum == null || noviRocisteDatum.equals("")) {
noviRocisteDatumDB = null;
} else {
String datumRocistaSt = new SimpleDateFormat("yyyy-MM-dd").format(noviRocisteDatum);
noviRocisteDatumDB = java.sql.Date.valueOf(datumRocistaSt);
}
String izmena = "UPDATE predmeti SET prezime='" + novoPrezime + "', ime='" + novoIme + "', nas_broj='" + noviNasBroj + "', rociste_datum='" + noviRocisteDatumDB + "'where id='" + idNovo + "'";
try {
PreparedStatement ps = con.prepareStatement(izmena);
ps.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Для всех этих дат существуют операторы if else, и эти объекты проходят через контроллер с одноэлементным шаблоном. Я думаю, что нет необходимости помещать этот код сюда, потому что нет ошибок, и все работает нормально, кроме этих дат.
Думаю, что проблема с преобразованием даты. Не могли бы вы мне помочь?
Тем более, что вы уже используете PreparedStatement, подумайте об использовании его системы заполнителей ?. Как бы то ни было, вы пытаетесь обновить столбец даты значением 'null', которое, очевидно, не является допустимым строковым представлением даты.
Кроме того, пропустите Date и SimpleDateFormat, эти классы давно устарели. Предполагая, что вы можете использовать Java 8 или новее и JDBC 4.2 или новее, используйте java.time.LocalDate и ps.setObject(4, yourLocalDate). Я ожидал, что это сработает, если yourLocalDate тоже будет null. Поскольку datumRocista.equals("") никогда не будет истинным, Date не может быть равен строке.




когда вы выполняете конкатенацию строк, например
rociste_datum='" + noviRocisteDatumDB + "'
тогда вы получите
rociste_datum='null'
вместо
rociste_datum=null
на этот раз никаких цитат. db ожидает дату или значение null, а не строку 'null'
Следовательно, используйте заполнители перед созданием подготовленного оператора, а затем установите параметры.
"UPDATE predmeti SET prezime=?, ime=?, nas_broj=?, rociste_datum=? where id=?";
Я обновил код, но это все та же ошибка com.mysql.jdbc.MysqlDataTruncation: усечение данных: неправильное значение даты: 'null' для столбца 'rociste_datum' в строке 1 String izmena = "UPDATE predmeti SET prezime = ?, ime = ?, nas_broj = ?, rociste_datum =? где id =? "; попробуйте {PreparedStatement ps = con.prepareStatement (измена); ps.setString (1, novoPrezime); ps.setString (2, новоИме); ps.setInt (3, noviNasBroj); ps.setDate (4, noviRocisteDatumDB); ps.setInt (5, idNovo); ps.execute ();
Не пытайтесь вставлять переменные в свой SQL. Вместо этого используйте параметры выписки. См. xkcd.com/327