Сообщение о загадочном исключении HSQLDB: «функция не поддерживается» - PullRequest
9 голосов
/ 21 сентября 2010

У меня есть код JDBC, который вставляется в таблицу базы данных путем выполнения PreparedStatement.Когда я запускаю код в базе данных HSQLDB в памяти (как часть теста JUnit), я получаю исключение SQLFeatureNotSupportedException, единственной информацией которого является сообщение «функция не поддерживается» и код поставщика -1500.То, что я делаю, это простая вставка в таблицу - я не могу представить, что это не поддерживается в последней версии 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);
    }
}

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

- Джеймс

Ответы [ 3 ]

11 голосов
/ 21 сентября 2010

Вам необходимо вызвать preparedStatement.executeUpdate() (без параметра sql).

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

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

1 голос
/ 21 сентября 2010

Дополнительная информация, которую я нашел в 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.
0 голосов
/ 21 сентября 2010

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

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

...