Verursacht durch: java.lang.Classcastexception-Fehler: java.sql.Timestamp kann nicht gewirkt werden, um java.sql.Datum
Bin ich immer die unten angegebenen Fehler für die folgenden code-snippets:
try {
cRows = new CachedRowSetImpl();
while(cRows.next())
{
MyClass myClass = new MyClass();
myClass.setPrevDate(cRows.getDate("PREV_DATE")); //In debug mode, the error was throwing when I press Resume from here.
}
}
Fehler:
Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
In der Datenbank der Datentyp für die Spalte ist DATE
nur. Ich bin nicht in der Lage, herauszufinden, wo die Timestamp
kommt hier.
geben Sie mir Ihre volle Klassen, dann kann ich dir helfen
Wir müssen sehen, CachedRowSetImpl und MyClass code.
Wird diese Hilfe
Das hat nicht funktioniert für mich. Der Wert für meine Spalte ist
Wir müssen sehen, CachedRowSetImpl und MyClass code.
Wird diese Hilfe
http://stackoverflow.com/questions/20130129/error-java-sql-timestamp-cannot-be-cast-to-java-sql-date-in-jfreechart
CachedRowSetImpl
ist aus import com.sun.rowset.CachedRowSetImpl;
Das hat nicht funktioniert für mich. Der Wert für meine Spalte ist
18-09-14
und ist DATE
in Typ.InformationsquelleAutor NaaN | 2014-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Veraltet:
Verwenden
java.util.Date
für das Feld.java.sql.Timestamp
ist eine direkte Unterklasse. Wie istjava.sql.Date
- , Streifen Sie die Zeit Teil. Warum die java-Datenbank-Treiber nimmt das DATUM zu Timestamp " ist ein wenig komisch. Was ist der Datenbank-Anbieter? Haben Sie geben Sie eine Länge oder so??? Sind ja nur Daten gespeichert?Recherchiert:
Schaute ich in CachedRowSetImpl.java und die Oracle-docs und Oracle funktioniert alles Prima (java.sql.Date, java.sql.Time, java.sql.Timestamp konvertierbar).
Die CachedRowSetImpl nicht einfach werfen die DATUM-Objekt (und getObject wird wahrscheinlich wieder die hohe Auflösung Timestamp - mit der Zeit) auf java.sql.Heute, und das ist falsch.
So überschreiben oder Ersatz diese Sonne ist Klasse.
Oracle 11g
. Abgesehen von diesem, String , double etc. verwenden, die sind in Ordnung.Lassen Sie mich überprüfen Sie diese. So können wir nicht erwarten, dass ein
DATE
- Objekt zurückgegeben werden aus einer db-Spalte, auch wenn die Spalte Typ istDATE
(nach den Kommentarzeilen)?Auch wenn ich
new java.util.Date()
stattcRows.getDate("PREV_DATE")
der Fehler ist Weg. So können wir überprüfen, ob das Objekt zurückkommt, ist nichtDATE
... richtig?Wenn der Aufruf
ResultSet.getDate("PREV_DATE")
gut,Timestamp ts = rs.getTimestamp("PREV_DATE")
sollte möglich sein, und ich denke, dassrs.getObject("PREV_DATE")
ergibt sich ein Timestamp. Der Täter ist CachedRowImpl.Sie können überschreiben
getDate
aus CachedRowImpl und tun der cast auf java.util.Datum.InformationsquelleAutor Joop Eggen
Ich habe eine Forschung zu diesem Thema und fand einige nützliche links. Ich fand diese Verwirrung zwischen DATE und TIMESTAMP JDBC-Treiber. Und die meisten der links empfehlen die Verwendung von
-Doracle.jdbc.V8Compatible=true
. Für meinen JBoss ich habe dies inrun.bat
und das Problem gelöst habe.https://community.oracle.com/thread/68918?start=0&tstart=0
http://www.coderanch.com/t/90891/JBoss/oracle-jdbc-Compatible-true
Oracle doc teilt verschiedene Lösungen:
Ändern Sie Ihre Tabellen zu verwenden TIMESTAMP anstelle von DATUM. Dies ist wahrscheinlich
selten möglich, aber es ist die beste Lösung, wenn es ist.
Ändern Sie Ihre Anwendung mit defineColumnType, um die Spalten definieren
als TIMESTAMP sondern als DATUM. Gibt es Probleme mit diesem, weil
Sie wirklich nicht wollen, zu verwenden defineColumnType, es sei denn, Sie haben zu (siehe
Was ist defineColumnType und Wann sollte ich es verwenden? ).
Ändern Sie die zu verwendende Anwendung getTimestamp statt getObject. Diese
ist eine gute Lösung, wenn das möglich ist, aber viele Anwendungen enthalten
generischer code, der abhängig von getObject, so ist es nicht immer möglich ist.
Legen Sie die V8Compatible connection-Eigenschaft. Dies teilt die JDBC-Treiber
verwenden Sie die alte Zuordnung anstelle der neuen. Sie können dieses Kennzeichen setzen
entweder als eine Eigenschaft oder ein-system-Eigenschaft. Legen Sie die
Verbindung Eigentum, indem es die java.util.Eigenschaften-Objekt
übergeben DriverManager.getConnection oder
OracleDataSource.setConnectionProperties. Setzen Sie die Eigenschaft system
indem die option-D in der java-Befehlszeile.
java -Doracle.jdbc.V8Compatible="true" MyApp
Hier ist der link: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_00
InformationsquelleAutor NaaN