2010-09-21 1 views
7

У меня есть код JDBC, который вставляется в таблицу базы данных, выполняя PreparedStatement. Когда я запускаю код в базе данных HSQLDB в памяти (как часть теста JUnit), я получаю исключение SQLFeatureNotSupportedException, единственной информацией является сообщение «функция не поддерживается» и код поставщика -1500. То, что я делаю, является базовой вставкой в ​​таблицу - я не могу себе представить, что это не поддерживается в последнем HSQLDB.Сообщение об исключении критического сообщения HSQLDB: «функция не поддерживается»

Мой код:

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

Можно ли предположить, что может быть проблема или что-нибудь еще, что я должен исследовать дальше? Заранее спасибо за вашу помощь.

--James

+1

Try размещать больше информации: журнал исключения, версия вашего HSQLDB (2,0 возможно), ваша версия Java и т.д. Я ищу в чтобы помочь вам. Я предполагаю, что это проблема совместимости между jre и hsqldb. – Aito

+0

Спасибо большое, Айто. Я использую JAR-файл HSQLDB 2.0. Я запускаю код как часть теста JUnit 4. Я запускаю его из Eclise IDE, который использует 1.6 JRE. DataSource настроен с использованием Spring, и я получаю соединение с Spring JdbcTemplate, который я настроил в класс DAO, который содержит этот код. –

ответ

10

Необходимо позвонить по телефону preparedStatement.executeUpdate() (без параметра sql).

Вы назвали метод PreparedStatement.executeUpdate(String sql), что является незаконным в соответствии со спецификацией JDBC. Не имеет смысла снова передавать инструкцию SQL, потому что вы уже передали ее при создании объекта PreparedStatement. Даже подумал, что вы передаете одну и ту же строку, это не является законным для вызова этого метода. Немного странно, что вызов метода не является законным :-), но так оно и есть. Все стандартные совместимые драйверы JDBC должны вызывать исключение в этом случае.

Но я согласен, что сообщение об ошибке является загадочным.

+0

Бинго, вы победитель. Спасибо! –

-1

Системные проблемы с HSQLDB часто из-за несоответствия в сервере против версии драйвера (любое несоответствие вообще не будет работать в моем опыте).

Я в основном подозреваю это не ваш выпуск. Поскольку вы сказали, что db «в памяти», я предполагаю, что сервер & - это тот же файл .jar. Но в случае, если моя догадка ошибается, я думал, что выброшу это.

+0

Потому что это спекуляция, разве это не комментарий к вопросу, а не ответ? –

+0

@Jacob Tomaw - не так ли? Я никогда не видел такого руководства. И, более того, не 98% ответов на вопросы на этом сайте о спекуляции на каком-то уровне? Если бы спрашивающий человек знал достаточно подробностей о своей проблеме, чтобы не было необходимости в спекуляциях в поиске причины, разве он, вероятно, не смог бы найти ответ сам? –

+0

Willis Ваше предположение заключается в том, что ваш ответ бесполезен. Для меня было бы более полезно задать вопрос, который разъяснит вам эту проблему, и что искатель узнает ответ на вопрос «Когда вы говорите, что это база данных« в памяти », вы подразумеваете, что база данных и тест являются работает в одной JVM? " как комментарий. После ответа на этот вопрос вы можете предоставить информированный ответ. –

1

Некоторую дополнительную информацию я нашел в 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. 
Смежные вопросы