PDA

View Full Version : SQL Fehler SQL0181 in JT400 Toolbox for Java mit Datum 31.12.9999



itec01
20-07-17, 13:20
Hallo Zusammen,
für SQL Analysen und Test haben wir DbVisualizer im Einsatz. Für den Zugriff auf die AS/400 habe ich den JT400 JDBC Treiber (JT400.JAR) im Einsatz.
Nun haben wir Tabellen, wo das Datum 31.12.9999 steht (bedeutet in der Anwendung unknown). Dies setzt mir das Tool mit NULL um. Der NULL Indicator sitzt definitiv nicht.
Im debug mode habe ich gesehen, dass im result set der SQL0181 Fehler kommt.

Posting warning, id: 1 error class: 1 return code: 181 reason: [SQL0181] Value in date, time, or timestamp string not valid. state: 01534.java.sql.SQLWarning: [SQL0181] Value in date, time, or timestamp string not valid.

Wenn ich das gleiche SQL mi iAccess aufrufe (RUN SQL scripts), dann wird 31.12.9999 sauber angezeigt. Hier wird vermutlich ein anderer Treiber genutzt.

Gibt es noch einen alternativen JDBC Treiber oder kann man den JT400 modifizieren? In den Einstellungen von DbVisualizer geht es leider nicht.

Danke.
Gruß Klaus

Fuerchau
20-07-17, 18:26
Datumformat des JDBC-Treiberst steht defaultmäßig wohl nicht auf ISO sondern ggf. auf TT.MM.JJ und für das 2-stellige Jahr ist 9999 eben zu groß und: das Datum wird ggf. als String übergeben, denn als SQL-Date dürfte das Problem nicht bestehen.
Da kann man mal sehen, wie wichtig das Datumformat für SQL nun doch ist.

itec01
21-07-17, 07:13
Moin,
andere ISO Datums, wie 21.07.2017 werden korrekt angezeigt, nur eben 31.12.9999 nicht.
Wie kann man überprüfen, wie das JDBC Treiberset konfiguriert ist, bzw. wie kann man es dann auch ändern?
Alternativ, welches Treiberset könnte man noch nehmen?
Danke.

Fuerchau
21-07-17, 09:48
Es ligt nicht am Treiberset sondern am ConnectionString.
Hier kann man Defaults überschreiben. Da musst du mal in die Doku schauen was man da einstellen kann. Häufig wird hier ein Datum als Typ String und nicht als Typ Date übergeben.
Dass dann die Darstellung in Java mit .2017 korrekt ist liegt daran, dass beim Reader.GetDate() ja in ein Date umgewandelt wird und auch hier gilt, dass zwischen hier mit einer Range (ich weiß im Moment nicht welche) zwischen 1900 und 2000 unterschieden wird (wie bei AS/400 mit <=39=20, >=40=19).
Versuche da mal ein Datum .2101.

itec01
21-07-17, 10:59
Super, das war es. Der Connectionstring für date war leer. Habe es auf iso geändert und schon hat es funktioniert. Vielen Dank für die Hilfe.

Fuerchau
21-07-17, 16:14
Ich würde trotzdem mal schauen, dass man Date auch als SQLDate und nicht SQLString erhält.
Allerdings kann ich da keinen Hinweis finden, das scheint es nur bei OLEDB zu geben.
https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/rzahh/javadoc/com/ibm/as400/access/doc-files/JDBCProperties.html#other