我有通过执行PreparedStatement插入数据库表中的JDBC代码。当我在内存中的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); } }
谁能说出问题所在或我需要进一步调查的其他事项?在此先感谢您的帮助。
您需要调用preparedStatement.executeUpdate()(不带参数sql)。
preparedStatement.executeUpdate()
sql
您调用了method PreparedStatement.executeUpdate(String sql),根据JDBC规范,该方法是非法的。再次传递SQL语句实际上没有任何意义,因为在创建PreparedStatement对象时已经传递了该语句。即使认为您传递了相同的字符串,调用此方法也是不合法的。调用方法是不合法的:-)有点奇怪,但这就是事实。在这种情况下,所有符合标准的JDBC驱动程序都需要引发异常。
PreparedStatement.executeUpdate(String sql)
但我同意错误消息是含糊的。