wake-up-neo.net

Java: Einfügen in Datums- und Datumsdaten einer Tabelle

Ich versuche, das aktuelle Datum und die Uhrzeit in eine Variable in der MS-SQL-Datenbank einzufügen .. __ Ich verwende dieses Format: 

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
Calendar cal = Calendar.getInstance();  
System.out.println(dateFormat.format(cal.getTime()));

und ich bekomme dies als Ergebnis 2013-01-28 09: 29: 37.941

Mein Feld in der Datenbank ist datetime definiert, und wie ich in anderen Tabellen gesehen habe, die das gleiche Feld haben, werden Datum und Uhrzeit genauso geschrieben wie diese 2011-07-05 14: 18: 33.000.

Ich versuche, mit einer Abfrage, die ich in einem Java-Programm durchführe, in die Datenbank einzufügen, aber ich erhalte diesen Fehler

SQL-Ausnahme: Status: S0003 Nachricht: Die Konvertierung eines varchar-Befehls Datentyp zu einem Datetime-Datentyp des Werts ist außerhalb des Bereichs. Error : 242

Meine Frage ist so: 

query = "INSERT INTO Companies CreatedOn"+ 
         "VALUES ('" + dateFormat.format(cal.getTime()) + "')"

aber ich verstehe nicht, was ich falsch mache.

8
Dimitra Micha

Entsprechend der Fehlerbeschreibung fügen Sie einen falschen Typ in die Datenbank ein. Siehe JDBC to MSSQL . Sie sollten Kalender in Zeitstempel konvertieren.

Versuchen Sie es mit:

PrepareStatement statement 
    = connection.prepareStatement("INSERT INTO Companies CreatedOn VALUES(?)");
Java.sql.Timestamp timestamp = new Java.sql.Timestamp(cal.getTimeInMillis());
statement.setTimestamp(1, timstamp);
int insertedRecordsCount = statement.executeUpdate();
17
Taky

Verwenden Sie zunächst KEINE String-Verkettung. Haben Sie jemals ein Herz von SQL Injection ?

Um dies richtig zu machen, verwenden Sie die vorbereitete Anweisung:

Die Idee ist, Sie definieren eine Anweisung mit Platzhaltern und definieren dann einen Wert für diese Platzhalter.

Siehe @Taky ' s answer für weitere Details.

3
Betlista

dateFormat#format Diese Methode gibt eine formatierte Zeichenfolge und kein Date-Objekt zurück. Das Datenbankfeld ist DateTime und erwartet, dass dort Java.sql.Timestamp und nicht String gemäß docs eingefügt wird. 

Um mit der Definition von SQL DATE übereinzustimmen, sind die Millisekundenwerte Umhüllt von einer Java.sql.Date-Instanz muss durch die Einstellung von .__ "normalisiert" werden. Stunden, Minuten, Sekunden und Millisekunden in bestimmte Zeitzone, der die Instanz zugeordnet ist.

Versuchen Sie ein Java.sql.Timestamp-Objekt anstelle von String in der Abfrage. Ich würde empfehlen, PreparedStatement zu verwenden. 

Wenn Sie das aktuelle Datum und die aktuelle Uhrzeit speichern möchten, sollten Sie MYSQL eingebaute Methode NOW (). Verwenden. Kurzdokumentation finden Sie unter http: //dev.mysql .com/doc/refman/5.5/de/Datums- und Zeitfunktionen.html . Ihr Code wird also so sein.

INSERT INTO Companies CreatedOn VALUES(NOW())"

Wenn Sie jedoch Java Date-util verwenden möchten, sollte dies der Fall sein

Calendar cal = Calendar.getInstance(); 
Java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
0
arvin_codeHunk

Sie könnten Joda framework verwenden, um mit date/time ..__ zu arbeiten. Es ordnet Hibernate/SQL-Typen problemlos ihre eigenen Datums-/Zeit-Typen zu. Wenn Sie in HQL Parameter setzen, führt joda eine richtige Typzuordnung durch .

0
Denys

Dies liegt daran, dass Sie versuchen, den String-Datumswert im Feld "Datumstyp-DB" zu speichern.

konvertieren Sie es in Data DataType 

Sie können auch das Format datetime "unseparated" verwenden. yyyymmdd hh:mm:ss

0
TheWhiteRabbit