2010-09-21 16 views
7

मेरे पास जेडीबीसी कोड है जो एक तैयार तालिका निष्पादित करके डेटाबेस तालिका में प्रवेश करता है। जब मैं एक इन-मेमोरी एचएसक्यूएलडीबी डेटाबेस (एक जुनीट टेस्ट के हिस्से के रूप में) पर कोड चलाता हूं तो मुझे एक SQLFeatureNotSupportedException मिलता है जिसमें केवल "सूचना समर्थित नहीं है" और विक्रेता कोड -1500 संदेश होता है। मैं जो कर रहा हूं वह एक तालिका में एक बुनियादी सम्मिलन है - मैं कल्पना नहीं कर सकता कि यह नवीनतम एचएसक्यूएलडीबी में असमर्थित है।एचएसक्यूएलडीबी क्रिप्टिक अपवाद संदेश: "सुविधा समर्थित नहीं है"

मेरे कोड:

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

+1

प्रयास करें: अपवाद का लॉग, अपने HSQLDB के संस्करण (2.0 शायद), अपने जावा संस्करण, आदि मैं में खोज रहा हूँ आपकी मदद करने के लिए आदेश। मुझे लगता है कि यह jre और your hsqldb के बीच संगतता की समस्या है। – Aito

+0

बहुत बहुत धन्यवाद, एटो। मैं एचएसक्यूएलडीबी 2.0 जेएआर फ़ाइल का उपयोग कर रहा हूं। मैं जुनीट 4 टेस्ट के हिस्से के रूप में कोड चला रहा हूं। मैं इसे एक्लिज़ आईडीई से लॉन्च करता हूं जो 1.6 जेआरई का उपयोग कर रहा है। डेटासोर्स स्प्रिंग का उपयोग करके कॉन्फ़िगर किया गया है और मुझे एक स्प्रिंग जेडीबीसी टेम्पलेट से कनेक्शन मिल रहा है जिसे मैंने डीएओ कक्षा में कॉन्फ़िगर किया है जिसमें यह कोड है। –

उत्तर

10

आपको preparedStatement.executeUpdate() पर कॉल करने की आवश्यकता है (पैरामीटर sql के बिना)।

आपने विधि PreparedStatement.executeUpdate(String sql) कहा, जो जेडीबीसी विनिर्देश के अनुसार अवैध है। यह सचमुच SQL कथन को पारित करने के लिए समझ में नहीं आता है, क्योंकि जब आप प्रीपेर्डस्टेटमेंट ऑब्जेक्ट बनाते हैं तो आप इसे पहले ही पार कर चुके हैं। यहां तक ​​कि सोचा था कि आप एक ही स्ट्रिंग पास करते हैं, इस विधि को कॉल करना कानूनी नहीं है। यह थोड़ा अजीब बात है कि एक विधि को कॉल करना कानूनी नहीं है :-) लेकिन यह वही तरीका है। सभी मानक अनुरूप जेडीबीसी ड्राइवरों को इस मामले में अपवाद फेंकने की जरूरत है।

लेकिन मैं सहमत हूं कि त्रुटि संदेश गूढ़ है।

+0

बिंगो, आप विजेता हैं। बहुत बहुत धन्यवाद! –

-1

HSQLDB साथ प्रणालीगत मुद्दों अक्सर सर्वर बनाम ड्राइवर को संस्करण में बेमेल (किसी भी बेमेल बिल्कुल मेरे अनुभव में काम नहीं करेगा) की वजह से कर रहे हैं।

मुझे ज्यादातर संदेह है कि यह आपकी समस्या नहीं है। चूंकि आपने कहा था कि डीबी "स्मृति में" है, मैं सर्वर का अनुमान लगा रहा हूं & चालक वही हैं .jar फ़ाइल। लेकिन अगर मेरा अनुमान गलत है, तो मैंने सोचा कि मैं इसे वहां फेंक दूंगा।

+0

क्योंकि यह अटकलें है, क्या यह सवाल पर कोई टिप्पणी नहीं होनी चाहिए, न कि जवाब? –

+0

@ जैकोब टॉमॉ - क्या यह चाहिए? मैंने कभी ऐसा दिशानिर्देश नहीं देखा है। और क्या अधिक है, इस स्तर पर कुछ स्तरों पर अटकलों के सवालों के जवाब 98% नहीं हैं? अगर पूछने वाले व्यक्ति को अपने मुद्दे के बारे में पर्याप्त जानकारी पता था कि इस कारण को खोजने में अटकलों की कोई आवश्यकता नहीं थी, तो क्या वह शायद खुद को जवाब नहीं ढूंढ पाएगा? –

+0

विलिस आपकी अटकलें यह है कि आपका उत्तर अनुपयोगी है। मेरे लिए, यह प्रश्न पूछने में और मददगार होगा जो आपके लिए इस मुद्दे को स्पष्ट करेगा और पूछताछकर्ता को जवाब मिलेगा कि "जब आप कहते हैं कि यह स्मृति 'डेटा बेस में है, तो आपका मतलब है कि डेटाबेस और परीक्षण हैं एक ही जेवीएम में चल रहा है? " एक टिप्पणी के रूप में। एक बार उस प्रश्न का उत्तर देने के बाद, आप एक सूचित उत्तर प्रदान कर सकते हैं। –

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. 
संबंधित मुद्दे