2010-09-21 57 views
7

我有通过执行PreparedStatement插入数据库表的JDBC代码。当我在内存中的HSQLDB数据库上运行代码时(作为JUnit测试的一部分),我得到一个SQLFeatureNotSupportedException,唯一的信息是消息“feature not supported”和供应商代码-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); 
    } 
} 

任何人都可以提出什么可能是我应该进一步调查的问题还是别的什么吗?在此先感谢您的帮助。

- 詹姆斯

+1

尝试发布信息记录异常,你的HSQLDB的版本(2.0也许),您的Java版本,等我在寻找为了帮助你。我认为这是jre和你的hsqldb兼容的问题。 – Aito 2010-09-21 17:27:13

+0

非常感谢Aito。我正在使用HSQLDB 2.0 JAR文件。我将代码作为JUnit 4测试的一部分运行。我从使用1.6 JRE的Eclise IDE启动它。 DataSource是使用Spring进行配置的,我从Spring JdbcTemplate中获取了连接,该连接已经配置到包含此代码的DAO类中。 – 2010-09-21 17:58:52

回答

10

您需要致电preparedStatement.executeUpdate()(不含参数sql)。

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

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

+0

宾果,你是赢家。非常感谢! – 2010-09-21 18:47:27

-1

与HSQLDB系统性问题往往是由于服务器与驱动程序版本不匹配(任何不匹配都不会在我的经验工作)。

我主要怀疑这个不是你的问题。既然你说的数据库是“内存中”,我猜服务器&驱动程序是相同的.jar文件。但如果我的猜测是错误的,我想我会把它扔到那里。

+0

因为这是猜测,这不应该是对问题的评论,而不是答案? – 2010-09-21 17:51:37

+0

@Jacob Tomaw - 应该吗?我从来没有见过这样的指导方针。更重要的是,98%的答案在某些层面上对本网站的投机问题没有回答。如果被问到的人知道有关他的问题的足够详细信息,从而不需要猜测发现原因,他是否可能自己找到了答案? – 2010-09-21 19:06:08

+0

Willis你的猜测是你的答案是无益的。对我而言,提出这个问题会更有助于解决问题,提问者会知道答案:“当你说这是一个'内存'数据库时,你的意思是数据库和测试是运行在同一个JVM中?“作为评论。一旦这个问题得到解答,你可以提供一个明智的答案。 – 2010-09-22 16:01:46

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.