2012-11-07 36 views
15

Pracuję nad aplikacją, która strumieniuje ResultSet przez sieć. Skończyło się na użyciu klasy CachedRowSetImpl. Ale kiedy połączyć się z Oracle DB, otrzymuję błąd jak tenjava.lang.ClassCastException: oracle.sql.TIMESTAMP nie można przesłać do java.sql.Timestamp

java.lang.ClassCastException: oracle.sql.TIMESTAMP nie mogą być oddane do java.sql.Timestamp

Proszę o pomoc.

Kod źródłowy jest w następujący sposób:

ResultSet res = response.getResultSet(); //resultset from the server 
while (res.next()) { 
    Agent agent = new Agent(); 
    agent.setName(res.getString(2)); 
    agent.setMobile(res.getString(1)); 
    agent.setBalance(res.getLong(4)); 
    agent.setLastUpdate(res.getDate(3)); //date from the result set 
    agent.setAccountNumber(res.getString(5)); 
} 

Błąd ...

java.lang.ClassCastException: oracle.sql.TIMESTAMP nie mogą być oddane do java.sql.Timestamp java.lang.ClassCastException: oracle.sql.TIMESTAMP nie mogą być oddane do java.sql.Timestamp na com.sun.rowset.CachedRowSetImpl.getDate (CachedRowSetImpl.java:2139)

+0

wysłać kod i stos ślad – Abubakkar

+0

java.lang.ClassCastException: oracle.sql.TIMESTAMP nie mogą być oddane do java.sql.Timestamp java.lang.ClassCastException: oracle.sql.TIMESTAMP nie mogą być oddane do java.sql. Znacznik czasu na com.sun.rowset.CachedRowSetImpl.getDate (CachedRowSetImpl.java:2139) –

+0

również umieść swój kod i całą ścieżkę stosu – Abubakkar

Odpowiedz

0

Myślę, że problem polega na tym, że Twój telefon setLastUpdate oczekuje obiektu typu java.sql.Date.

Teraz podczas korzystania agent.setLastUpdate(res.getDate(3));

The res.getDate(3) musi wracać do obiektu, że metoda nie oczekiwać więc Twój może być ClassCastException za to.

Spróbuj ten kod i zobacz, czy to rozwiązuje problem czy nie:

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime())); 
1

To dlatego oracle.sql.TIMESTAMP nie pochodzi od java.sql.TIMESTAMP:

java.lang.Object 
    -> oracle.sql.Datum 
    -> oracle.sql.TIMESTAMP 

Nie można rzucać ten pierwszy do późniejszego.

Zamiast używać oracle.sql.TIMESTAMP.timestampValue():

public Timestamp timestampValue(Calendar cal) throws SQLException 

zwraca toTimestamp do konwersji wewnętrznej Oracle Date i Kalendarz do Java Timestamp.

4

Znalazłem wyjście.

oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update"); 
agent.setLastUpdate(new Date(ts.dateValue().getTime())); 
0

Najprawdopodobniej używany getTIMESTAMP() zamiast getTimestamp(). Metody getTIMESTAMP() (i getDATE() są rozszerzenie OracleResultSet które zwracają Oracle określonych typów.

Jeśli nie, to nie używasz sterownika JDBC, ponieważ returntype z getDate() jest java.sql.Date i getTimestamp() jest java.sql.Timestamp, więc to nie może być zupełnie inny typ niż w twoim pytaniu.

18

Javadoc do ResultSet.getObject() ustala, że ​​typ JDBC powinny być przypisane do typu Java, jak określono w specyfikacji JDBC (TIMESTAMP -> java.sqlTimestmp):

Metoda ta zwraca wartość podana kolumna jako obiekt Java . Typ obiektu Java będzie domyślnym typem obiektu Java odpowiadającym typowi SQL kolumny, po odwzorowaniu dla typów wbudowanych określonych w specyfikacji JDBC.

Jak zauważyliście, sterownik Oracle jest domyślnie niezgodnych z normą i wykorzystuje oracle.sql.TIMESTAMP zamiast (który nie obejmuje java.sql.Timestamp). Dobrą wiadomością jest to, że można wymusić przestrzeganie JDBC ustawiając właściwość systemuoracle.jdbc.J2EE13Compliant do true podczas uruchamiania vm:

java -Doracle.jdbc.J2EE13Compliant=true YourApplication 

lub programowo

System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true") 

Gdy to zrobisz, getResult() zwróci instancje java.sql.Timestamp zgodnie z oczekiwaniami.

Aby uzyskać więcej informacji, zobacz odpowiednią sekcję z Oracle JDBC Driver Documentation, która opisuje kilka sposobów ustawiania oracle.jdbc.J2EE13Compliant.

+1

Odpowiedź Vincenta wyjaśnia, dlaczego wyjątek został podniesiony, ale ta odpowiedź (Bogdana) jest powodem, dla którego oryginalny kod wyświetla obiekt oracle.sql.Timestamp zamiast obiektu java.sql.Timestamp. Jeśli wiesz, że zawsze chcesz ustawić właściwość J2EE13Compliant, możesz to zrobić w kodzie za pomocą 'Properties props = System.getProperties(); props.setProperty ("oracle.jdbc.J2EE13Compliant", "true"); ' – drootang

1

Można to rozwiązać, używając funkcji timestampValue() obecnej w klasie oracle.sql.TIMESTAMP. Ta metoda przekonwertuje plik oracle.sql.TIMESTAMP na java.sql.Timestamp.

oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject ("last_update"); agent.setLastUpdate (ts.timestampValue());

Powiązane problemy