2010-09-21 25 views
7

Ho codice JDBC che si inserisce in una tabella del database eseguendo un PreparedStatement. Quando eseguo il codice su un database HSQLDB in memoria (come parte di un test JUnit) ottengo un SQLFeatureNotSupportedException con l'unica informazione che è il messaggio "funzionalità non supportata" e il codice fornitore -1500. Quello che sto facendo è un inserimento di base in un tavolo - non posso immaginare che questo non sia supportato nell'ultimo HSQLDB.HSQLDB messaggio di eccezione criptico: "Non funzionalità supportata"

Il mio codice:

public Observations saveOrUpdate(final Observations observations) 
{ 
    try 
    { 
     if (connection == null) 
     { 
      connection = getJdbcTemplate().getDataSource().getConnection(); 
     } 

     // create the prepared statement 
     String sql = "INSERT INTO " + Observations.TABLE_NAME + 
        " (OBS_YEAR, WINTER, SPRING, SUMMER, FALL, ANNUAL, DATA_TYPE, CREATED_DATE, UPDATED_DATE, " + 
        Observations.ID_COLUMN_NAME + 
        ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 
     PreparedStatement preparedStatement = connection.prepareStatement(sql); 
     preparedStatement.setInt(1, observations.getYear()); 
     preparedStatement.setBigDecimal(2, observations.getJan()); 
     preparedStatement.setBigDecimal(3, observations.getFeb()); 
     preparedStatement.setBigDecimal(4, observations.getMar()); 
     preparedStatement.setBigDecimal(5, observations.getApr()); 
     preparedStatement.setBigDecimal(6, observations.getMay()); 
     preparedStatement.setString(7, observations.getDataType().toString()); 
     preparedStatement.setTimestamp(8, new Timestamp(observations.getCreatedDate().getTime())); 
     preparedStatement.setTimestamp(9, new Timestamp(observations.getUpdatedDate().getTime())); 
     preparedStatement.setLong(10, observations.getId()); 
     preparedStatement.executeUpdate(sql); 

     return observations; 
    } 
    catch (SQLException ex) 
    { 
     throw new RuntimeException(ex); 
    } 
} 

chiunque può suggerire quello che potrebbe essere il problema o qualsiasi altra cosa che dovrei approfondire? Grazie in anticipo per il vostro aiuto.

--James

+1

tenta di registrare ulteriori informazioni: registro di eccezione, la versione del vostro HSQLDB (2.0 forse), la versione di Java, ecc Sto cercando in per aiutarti Presumo che sia un problema di compatibilità tra jre e hsqldb. – Aito

+0

Grazie mille, Aito. Sto usando il file JAR HSQLDB 2.0. Sto eseguendo il codice come parte di un test di JUnit 4. Lo lancio da Eclise IDE che utilizza un JRE 1.6. DataSource è configurato usando Spring e sto ottenendo la connessione da un JdbcTemplate di Spring che ho configurato nella classe DAO che contiene questo codice. –

risposta

10

È necessario chiamare preparedStatement.executeUpdate() (senza il parametro sql).

Hai chiamato il metodo PreparedStatement.executeUpdate(String sql), che è illegale in base alle specifiche JDBC. Non ha davvero senso passare di nuovo l'istruzione SQL, perché lo hai già passato quando hai creato l'oggetto PreparedStatement. Anche se hai pensato di passare la stessa stringa, non è legale chiamare questo metodo. È un po 'strano che chiamare un metodo non sia legale :-) ma è così. In questo caso tutti i driver JDBC conformi standard devono generare un'eccezione.

Ma sono d'accordo sul fatto che il messaggio di errore sia criptico.

+0

Bingo, sei il vincitore. Grazie mille! –

-1

problemi sistemici con HSQLDB sono spesso dovute a mancate corrispondenze in assistente vs. versione del driver (eventuali disallineamenti a tutti non funziona nella mia esperienza).

Ho per lo più il sospetto che questo non sia il problema. Dato che hai detto che il db è "in memoria", suppongo che il driver del server & sia lo stesso .jar. Ma nel caso in cui la mia ipotesi sia sbagliata, ho pensato di buttarla lì fuori.

+0

Perché questa è una speculazione, non dovrebbe essere un commento alla domanda e non una risposta? –

+0

@Jacob Tomaw - dovrebbe? Non ho mai visto una linea guida come quella. E per di più, il 98% delle risposte alle domande sulla speculazione di questo sito non è su un certo livello? Se la persona che chiedeva conoscesse abbastanza dettagli sul suo problema in modo tale che non ci fosse bisogno di speculazioni per trovare la causa, non sarebbe stato probabilmente in grado di trovare la risposta da solo? –

+0

Willis La tua ipotesi è che la tua risposta non sia di aiuto. Per me, sarebbe più utile porre la domanda che chiarirà il problema per te e che il richiedente conoscerà la risposta a "Quando dici che questo è un database" in memoria ", vuoi dire che il database e il test sono correre nella stessa JVM? " come commento Dopo aver risposto a questa domanda, è possibile fornire una risposta informata. –

1

Qualche ulteriore informazioni che ho trovato in http://hsqldb.org/doc/changelog_1_7_2.txt:

The execute(String sql), executeUpdate(String sql) and executeQuery(String sql) 
commands are no-longer supported for PreparedStatements according to JDBC specs. 
Use an ordinary Statement for calling these methods. 
Problemi correlati