2010-09-21 56 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.