HSQLDB隐藏异常消息:“功能不受支持”

时间:2010-09-21 16:47:14

标签: java sql exception jdbc hsqldb

我有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 个答案:

答案 0 :(得分:10)

您需要拨打preparedStatement.executeUpdate()(不带参数sql)。

您调用了方法PreparedStatement.executeUpdate(String sql),根据JDBC规范,这是非法的。再次传递SQL语句没有任何意义,因为您在创建PreparedStatement对象时已经传递了它。即使您认为传递相同的字符串,调用此方法也是不合法的。调用方法不合法有点奇怪:-)但这就是它的方式。在这种情况下,所有符合标准的JDBC驱动程序都需要抛出异常。

但我同意错误信息是神秘的。

答案 1 :(得分: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.

答案 2 :(得分:-1)

HSQLDB的系统性问题通常是由于服务器与驱动程序版本不匹配(根据我的经验,任何不匹配都不起作用)。

我大多怀疑不是你的问题。既然你说数据库是“在内存中”,我猜测服务器&驱动程序是相同的.jar文件。但是如果我猜错了,我以为我会把它扔出去。