Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSQLDB隐式异常消息:";“不支持功能”;_Java_Sql_Exception_Jdbc_Hsqldb - Fatal编程技术网

Java HSQLDB隐式异常消息:";“不支持功能”;

Java HSQLDB隐式异常消息:";“不支持功能”;,java,sql,exception,jdbc,hsqldb,Java,Sql,Exception,Jdbc,Hsqldb,我有JDBC代码,它通过执行PreparedStatement插入到数据库表中。当我在内存中的HSQLDB数据库上运行代码(作为JUnit测试的一部分)时,我得到一个SQLFeatureNotSupportedException,唯一的信息是消息“FeatureNotSupported”和供应商代码-1500。我所做的是向表中进行基本插入——我无法想象最新的HSQLDB中不支持这种插入 我的代码: public Observations saveOrUpdate(final Observatio

我有JDBC代码,它通过执行PreparedStatement插入到数据库表中。当我在内存中的HSQLDB数据库上运行代码(作为JUnit测试的一部分)时,我得到一个SQLFeatureNotSupportedException,唯一的信息是消息“FeatureNotSupported”和供应商代码-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);
    }
}
有人能告诉我可能存在什么问题或者我应该进一步调查的其他问题吗?提前感谢你的帮助


--James

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


我怀疑这不是你的问题。既然你说数据库“在内存中”,我猜服务器和驱动程序是同一个.jar文件。但是,如果我猜错了,我想我应该把它扔出去。

您需要调用
preparedStatement.executeUpdate()
(不带参数
sql

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


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

我在以下网站上找到了一些进一步的信息:


尝试发布更多信息:异常日志、HSQLDB版本(可能是2.0)、java版本等。我正在搜索以帮助您。我认为这是jre和hsqldb之间的兼容性问题。非常感谢,Aito。我正在使用HSQLDB2.0JAR文件。我将代码作为JUnit4测试的一部分运行。我从使用1.6JRE的EcliseIDE启动它。数据源是使用Spring配置的,我从配置到包含此代码的DAO类中的Spring JdbcTemplate获得连接。因为这是推测,这不应该是对问题的注释而不是答案吗?@Jacob Tomaw——应该吗?我从未见过这样的指导方针。更重要的是,这个网站上98%的问题答案不是在某种程度上猜测吗?如果提问者对自己的问题有足够的了解,因此没有必要猜测原因,那么他自己不可能找到答案吗?威利斯你的猜测是你的答案没有帮助。对我来说,问这样一个问题更有帮助,它将为您澄清这个问题,并且提问者将知道“当您说这是一个‘内存中’数据库时,您的意思是数据库和测试运行在同一个JVM中?”的答案,作为评论。一旦这个问题得到回答,你就可以提供一个有根据的答案。宾果,你是赢家。非常感谢!
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.