2010-12-29 13 views
1

Ich habe eine Tabelle mit einer Spalte, die eine in einer SQL Server 2008-Datenbank ist. Die Daten, die eingefügt werden, sind keine Zeitstempel in dem Sinne, dass die Verwendung von NOW beim Einfügen akzeptabel wäre. Das Datum wird ein wenig vor dem Einfügen generiert und ich möchte diesen Wert beibehalten.SQL Server 2008 Datetime-Spalte JDBC-Problem einfügen

Datumsangaben werden als Strings im Format yyyy-mm-dd hh:mm:ss.[fff...] serialisiert und vor dem Einfügen in ein JDBC-Timestamp-Objekt konvertiert.

Ein Problem, das ich in mit SQL Server ausgeführt habe, ist, dass es den Wert in TIMESTAMP konvertiert, bevor eingeführt und dann mit dieser klagt:

com.microsoft.sqlserver.jdbc.SQLServerException: 
Cannot insert an explicit value into a timestamp column. 
Use INSERT with a column list to exclude the timestamp column, 
or insert a DEFAULT into the timestamp column. 

Wie kann ich ohne die Umwandlung in eine DATETIME- Spalte legen Sie einfach ?

Danke.

+1

Sind Sie sicher, dass in der Tabelle keine Spalte vom Typ Timestamp vorhanden ist? Da diese aussehen wie SQL-Server-Fehlermeldungen nicht Zeitstempel nicht Java. - Zeigen Sie uns das Schema – Mark

+0

100%. Die Frage wurde bereits beantwortet. setString ist was Sie wollen, nicht setTimestamp. Ich denke, jeder JDBC-Treiber beschäftigt sich mit Datumzeiten auf verschiedene Arten. – Max

Antwort

4

Ein TIMESTAMP-Datentyp von SQL Server ist kein datumsähnlicher Datentyp. Es ist ein servergenerierter Wert, der zur Datenkonsistenz verwendet wird. Wenn Sie Datetime-Daten speichern, vermeiden Sie den TIMESTAMP-Datentyp.

Also konvertieren Sie nicht in ein JDBC-Timestamp-Objekt. Daten können als Zeichenfolgenwert eingefügt werden. Beachten Sie, dass das Format, das Sie angeben, in Ordnung ist, aber die fff... muss 3 Ziffern, nicht mehr als 3 Ziffern für einen SQL Server DATETIME-Datentyp sein.

+0

Deshalb war ich verwirrt, weil ich weiß, dass ich keine Zeitstempel-Konvertierung wollte (setTimestamp arbeitet mit MySQL DATETIME-Typen, so dass es verwirrend ist). setString() funktioniert stattdessen. Vielen Dank! – Max

+1

ja. SQL Server TIMESTAMP ist verwirrend, und die gute Nachricht ist, dass es veraltet ist. Es wird durch das Schlüsselwort ROWVERSION ersetzt, das die Verwirrung verringern soll. – bobs

+0

Worüber ich am meisten verwirrt war, ist die fehlende Unterstützung für datetime in jdbc. Sie erhalten entweder ein Datum, eine Uhrzeit oder einen Zeitstempel, aber kein Datum/Uhrzeit. setString ist keine naheliegende Möglichkeit, eine Datetime festzulegen. – Max

0

Wenn die Spalte definiert ist als ein Timestamp hier ist ein Zitat aus dem SQL Server-Online:

Der SQL Server-Zeitstempel-Datentyp hat nichts mit Zeiten oder Terminen zu tun. SQL Server-Zeitstempel sind Binärzahlen , die die relative Sequenz in angeben, welche Datenänderungen in einer Datenbank stattfanden. Der Zeitstempel-Datentyp wurde ursprünglich implementiert, um die SQL Server-Wiederherstellungsalgorithmen zu unterstützen.

Weiter heißt es niemals Zeitstempel Spalten in Tasten verwenden, insbesondere primäre Schlüssel, da der Zeitstempel Wert jedes Mal ändert sich die Zeile modifiziert ist.

+1

Ich sagte, es war nicht als Zeitstempel definiert, sondern als Datetime. – Max