2012-11-07 17 views
15

Sto lavorando a un'applicazione che trasmette ResultSet su una rete. Ho finito per utilizzare una classe CachedRowSetImpl. Ma quando mi connetto ad un DB Oracle, ottengo un errore come questojava.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere lanciato su java.sql.Timestamp

java.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere lanciato a java.sql.Timestamp

prega di aiuto.

Il codice sorgente è il seguente:

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)); 
} 

L'errore ...

java.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere lanciato a java.sql.Timestamp java.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere lanciato a java.sql.Timestamp a com.sun.rowset.CachedRowSetImpl.getDate (CachedRowSetImpl.java:2139)

+0

pubblicare il tuo codice e lo stack trace – Abubakkar

+0

java.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere lanciato a java.sql.Timestamp java.lang.ClassCastException: oracle.sql.TIMESTAMP non può essere gettato a java.sql. Timestamp su com.sun.rowset.CachedRowSetImpl.getDate (CachedRowSetImpl.java:2139) –

+0

inserisci anche il tuo codice e l'intera traccia dello stack – Abubakkar

risposta

0

Penso che il problema è che il tuo setLastUpdate si aspetta un oggetto di tipo java.sql.Date.

Ora, quando si utilizza agent.setLastUpdate(res.getDate(3));

Il res.getDate(3) deve essere la restituzione di un oggetto che il metodo non si aspetta così il vostro ci possono essere ClassCastException per questo.

Prova questo codice e vedere se si risolve il problema o non:

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

Questo perché oracle.sql.TIMESTAMP non deriva da java.sql.TIMESTAMP:

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

Non puoi lanciare il primo nel dopo.

Invece utilizzare oracle.sql.TIMESTAMP.timestampValue():

public Timestamp timestampValue(Calendar cal) throws SQLException 

chiede toTimestamp per convertire interno Oracle Date e agenda con un Java Timestamp.

4

Ho trovato una via d'uscita.

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

Molto probabilmente si è utilizzato getTIMESTAMP() invece di getTimestamp(). I metodi getTIMESTAMP() (e getDATE() sono estensione nella OracleResultSet che restituiscono tipi specifici di Oracle.

Se poi non si non si utilizza un driver JDBC, perché il returnType di getDate() è java.sql.Date e di getTimestamp() è java.sql.Timestamp, quindi non può essere un tipo completamente diverso come nella tua domanda.

18

Javadoc per ResultSet.getObject() mandati che il tipo JDBC deve essere associato a un tipo Java come prescritto dalle specifiche JDBC (TIMESTAMP -> java.sqlTimestmp):

Questo metodo restituirà il valore della data colonna come oggetto Java . Il tipo dell'oggetto Java sarà il tipo di oggetto Java predefinito corrispondente al tipo SQL della colonna, seguendo la mappatura per i tipi integrati specificati nella specifica JDBC.

Come avrete notato, il driver Oracle è da non compatibile con lo standard di defaulte utilizza oracle.sql.TIMESTAMP invece (che non si estende java.sql.Timestamp). La buona notizia è che è possibile forzare la conformità JDBC impostando la oracle.jdbc.J2EE13Compliant proprietà di sistema a true durante l'avvio VM:

java -Doracle.jdbc.J2EE13Compliant=true YourApplication 

oa livello di programmazione

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

Una volta fatto questo, getResult() restituirà istanze di java.sql.Timestamp, come previsto.

Per ulteriori dettagli, consultare la sezione pertinente da Oracle JDBC Driver Documentation, che descrive diversi modi di impostazione di oracle.jdbc.J2EE13Compliant.

+1

La risposta di Vincent spiega perché viene sollevata l'eccezione, ma questa (la risposta di Bogdan) è la ragione per cui il codice originale vede un oggetto oracle.sql.Timestamp invece di un oggetto java.sql.Timestamp. Se sai che vuoi sempre il set di proprietà J2EE13Compliant, puoi farlo nel codice usando 'Properties props = System.getProperties(); props.setProperty ("oracle.jdbc.J2EE13Compliant", "true"); ' – drootang

1

Questo può essere risolto utilizzando la funzione timestampValue() presente nella classe oracle.sql.TIMESTAMP. Questo metodo convertirà oracle.sql.TIMESTAMP in java.sql.Timestamp.

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

Problemi correlati