2015-10-19 13 views
10

Próbuję zaktualizować tabelę z aplikacji Java, w której pewna kolumna może być ma wartość NULL. Próbowałem kilka różnych podejść, ale zawsze pojawia się następujący błąd:MySQL Nieprawidłowa wartość daty: null

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'scheidingsdatum' at row 1

Zrobiłem pewien, że tabela dozwolone wartości NULL w polu scheidingsdatum i można wstawić wartości NULL gdy bezpośrednio wkładając w MySQL

jest to struktura tabeli w phpMyAdmin:

PHPMyAdmin table structure

tabele używać InnoDB

I wypróbowane następujące rozwiązania:

1: Wystarczy użyć zmienną pustą w parametrze

stmnt = conn.prepareStatement("UPDATE gezinnen SET " 
          + "ouder1 = ?," 
          + "ouder2 = ?," 
          + "huwelijksdatum = ?," 
          + "scheidingsdatum = ? " 
          + "WHERE gezinsNummer = ?"); 

stmnt.setString(1, ouder1); 
stmnt.setString(2, ouder2); 
stmnt.setString(3, huwelijksdatum); 
stmnt.setString(4, scheidingsdatum); 
stmnt.setString(5, nummer); 

2: kodować pusta w zapytaniu (wewnątrz jeśli/inny blok)

stmnt = conn.prepareStatement("UPDATE gezinnen SET " 
          + "ouder1 = ?," 
          + "ouder2 = ?," 
          + "huwelijksdatum = ?," 
          + "scheidingsdatum = NULL " 
          + "WHERE gezinsNummer = ?"); 

stmnt.setString(1, ouder1); 
stmnt.setString(2, ouder2); 
stmnt.setString(3, huwelijksdatum); 
stmnt.setString(4, nummer); 

3: Zastosowanie setNull (4, java.sql.Types.DATE)

stmnt = conn.prepareStatement("UPDATE gezinnen SET " 
          + "ouder1 = ?," 
          + "ouder2 = ?," 
          + "huwelijksdatum = ?," 
          + "scheidingsdatum = ? " 
          + "WHERE gezinsNummer = ?"); 

stmnt.setString(1, ouder1); 
stmnt.setString(2, ouder2); 
stmnt.setString(3, huwelijksdatum); 
stmnt.setNull(4, java.sql.Types.DATE); 
stmnt.setString(5, nummer); 

4: Wykorzystanie setNull (4, java.sql.Types.NULL)

stmnt = conn.prepareStatement("UPDATE gezinnen SET " 
          + "ouder1 = ?," 
          + "ouder2 = ?," 
          + "huwelijksdatum = ?," 
          + "scheidingsdatum = ? " 
          + "WHERE gezinsNummer = ?"); 

stmnt.setString(1, ouder1); 
stmnt.setString(2, ouder2); 
stmnt.setString(3, huwelijksdatum); 
stmnt.setNull(4, java.sql.Types.NULL); 
stmnt.setString(5, nummer); 

po to mój plik database.properties i tworzenie gra:

bazy danych. właściwości

jdbc.drivers=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://IP:3306/TABLE_NAME 
jdbc.username=USER 
jdbc.password=PASSWORD 

utworzenie połączenia

Class.forName(props.getProperty("jdbc.drivers")).newInstance(); 
this.conn = (Connection) DriverManager.getConnection(props.getProperty("jdbc.url"),props.getProperty("jdbc.username"),props.getProperty("jdbc.password")); 
+0

@ YassinHajaj NULL to specjalna wartość, SQL jest 3-wartościowym językiem logicznym. OP chce NULL, a nie niektóre zastąpienie go. Jeśli korzystasz z wymiany, musisz o tym pamiętać i odpowiednio zmodyfikować wszystkie swoje zapytania. –

+0

@ YassinHajaj Każda data jest teoretycznie możliwa. –

+0

@dognose To działa dla insertów, ale co z aktualizowaniem? Powinna być możliwa zmiana z rzeczywistej daty na późniejszą wartość null. –

Odpowiedz

4

Zrobiłem test i pracował dla mnie stmnt.setNull(4, java.sql.Types.Date);, jesteś pewien, że dla stmnt.setString(3, huwelijksdatum); wartość huwelijksdatum jest ważna data mysql ciąg, a nie „null”?

+0

To był rzeczywiście problem, jak wyjaśnić tutaj http://stackoverflow.com/a/33224384/4385713 –

0

Jeśli scheidingsdatum jest polem pustych, a następnie po prostu usunąć go z instrukcji UPDATE, gdy jego wartość jest zerowa. Innymi słowy, gdy scheidingsdatum jest null, zmień oświadczenie:

UPDATE gezinnen SET ouder1 = ?, ouder2 = ?, huwelijksdatum = ? 
WHERE gezinsNummer = ? 
+3

Ale czy nie pozostałaby ona taka sama jak przed aktualizacją? Scheidingsdatum może być zerowany po ustawieniu. –

+0

Ah dobry punkt. Następnie w przypadku, gdy scheidingsdatum ma być zapisany jako null, zastąp "scheidingsdatum =?" z "scheidingsdatum = null". –

2

Można spróbować TIMESTAMP zamiast datę w przygotowanym oświadczeniu.

stmnt.setNull(4, java.sql.Types.TIMESTAMP); 
+0

Ciągle otrzymuję ten sam wyjątek, gdy robię to, niestety :( –

3

Cóż, to najgłupsza poprawka w historii.

Kod został pierwotnie zrobiony przez kogoś innego, a ja tylko trochę go rozszerzyłem. Najpierw utworzono ciąg scheidingsDatum = "null";, który zostałby zastąpiony rzeczywistą datą, gdyby taki był.

Założono (Wiem, nigdy nie należy zakładać, że jest to inteligentne), że będzie to wartość pusta (zauważ brak cytatów?), Gdy nie ma wartości.

Tak więc, w moim czeku, ciąg nie był pusty (ponieważ był "zerowy") i dlatego pierwsza część została wykonana. Co sprawiło, że próbował wstawić ciąg "null", co jest oczywiście niepoprawną datą.

Po prostu modyfikowanie łańcucha znaków jako wartości pustej zamiast "zerowej" podczas tworzenia wystąpił problem.

Powiązane problemy