2010-09-21 33 views
7

Bir PreparedStatement çalıştırılarak bir veritabanı tablosuna eklenen JDBC kodum var. Bir bellek içi HSQLDB veritabanındaki kodu (JUnit sınamasının bir parçası olarak) çalıştırdığımda, "özellik desteklenmiyor" iletisi ve satıcı kodu -1500 olan tek bir bilgiyle SQLFeatureNotSupportedException alıyorum. Ne yapıyorum bir tabloya temel bir ekleme - Bu en son HSQLDB desteklenmez olduğunu düşünemiyorum.HSQLDB şifreli özel durum iletisi: "özellik desteklenmiyor"

Kodum:

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); 
    } 
} 

kimse daha ayrıntılı bir araştırma gerektiğini sorun veya başka bir şey ne olabilir önerebilirsiniz? Yardımlarınız için şimdiden teşekkür ederiz. HSQLDB ile

--James

+1

Dene: istisna günlüğü, (belki 2.0) sizin HSQLDB sürümünü java versiyonu, vb Ben Arıyorum size yardımcı olmak için. Ben jre ve hsqldb arasındaki bir uyum sorunu olduğunu varsayalım. – Aito

+0

Çok teşekkürler, Aito. HSQLDB 2.0 JAR dosyasını kullanıyorum. Kodu JUnit 4 testinin bir parçası olarak çalıştırıyorum. 1.6 JRE kullanan Eclise IDE'den başlatıyorum. DataSource, Spring kullanarak yapılandırıldı ve bu kodu içeren DAO sınıfına yapılandırdığım bir Spring JdbcTemplate bağlantısından bağlantı alıyorum. –

cevap

10

preparedStatement.executeUpdate() numaralı telefonu (sql parametresi olmadan) aramanız gerekir.

JDBC belirtimine göre yasa dışı olan PreparedStatement.executeUpdate(String sql) yöntemini çağırdınız. PreparedStatement nesnesini oluşturduğunuzda zaten geçtiyseniz, SQL deyimini yeniden iletmek gerçekten mantıklı değil. Aynı diziyi geçtiğiniz düşünülse bile, bu yöntemi çağırmak yasal değildir. Bir yöntemin çağrılmasının yasal bir sorun olmadığını söylemek biraz garip ama bu böyle. Tüm standart uygun JDBC sürücülerinin bu durumda bir istisna atması gerekir.

Ancak hata iletisinin şifreli olduğunu kabul ediyorum.

+0

Bingo, kazanan sizsiniz. Çok teşekkürler! –

-1

Sistemik sorunlar genellikle sürücü sürümü vs sunucuda uyuşmazlıkları (herhangi bir uyumsuzluk hiç benim deneyim çalışmaz) kaynaklanmaktadır.

Bu numaralı sorunundan şüpheleniyorsanız, sorununuzun olduğunu bilmiyorum. Db'nin "bellekte" olduğunu söylediğinden beri, sunucu & sürücüsünün aynı .jar dosyası olduğunu tahmin ediyorum. Ama benim tahminin yanlış olması durumunda, bunu oraya atacağımı düşündüm.

+0

Bu bir spekülasyon olduğu için, bu soruya bir cevap değil, bir yorum değil midir? –

+0

@Jacob Tomaw - yapmalı mı? Hiç böyle bir kılavuz görmedim. Ve dahası, bu sitedeki spekülasyon sorularının% 98'i bir düzeyde spekülasyon değil mi? Sorucu kişi, meseleyi bulmak için spekülasyona ihtiyaç duymayacak kadar konuyla ilgili yeterince ayrıntı biliyorsa, muhtemelen cevabı kendisi bulamadı mı? –

+0

Willis Spekülasyonunuz, cevabınızın yararsızdır. Bana göre, sizin için konuyu açıklığa kavuşturacak olan soruyu sormak daha da yardımcı olacaktır ve bu sorunun cevabını "Hafızada bir" veri tabanı "dediğinizde, bu veritabanının ve testin aynı JVM'de mi çalışıyor? " Yorum olarak Bu soruya cevap verildikten sonra, bilinçli bir cevap verebilirsiniz. –

1

ben http://hsqldb.org/doc/changelog_1_7_2.txt bulunan bazı başka bilgi: Daha fazla bilgi göndermek için

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.