2012-11-07 18 views
15

मैं किसी ऐसे एप्लिकेशन पर काम कर रहा हूं जो नेटवर्क पर ResultSet स्ट्रीम करता है। मैं एक CachedRowSetImpl कक्षा का उपयोग कर समाप्त हो गया। लेकिन जब मैं एक Oracle DB से कनेक्ट, मैं इसjava.lang.ClassCastException: oracle.sql.TIMESTAMP को java.sql पर नहीं डाला जा सकता है। टिमस्टैम्प

java.lang.ClassCastException की तरह कोई त्रुटि मिलती है: oracle.sql.TIMESTAMP java.sql.Timestamp

में ढाला नहीं जा सकता

कृपया मदद करते हैं।

स्रोत कोड इस प्रकार है:

ResultSet res = response.getResultSet(); //resultset from the server 
while (res.next()) { 
    Agent agent = new Agent(); 
    agent.setName(res.getString(2)); 
    agent.setMobile(res.getString(1)); 
    agent.setBalance(res.getLong(4)); 
    agent.setLastUpdate(res.getDate(3)); //date from the result set 
    agent.setAccountNumber(res.getString(5)); 
} 

त्रुटि ...

java.lang.ClassCastException: oracle.sql.TIMESTAMP java.sql.Timestamp में ढाला नहीं जा सकता java.lang.ClassCastException: (CachedRowSetImpl.java:2139) oracle.sql.TIMESTAMP com.sun.rowset.CachedRowSetImpl.getDate पर java.sql.Timestamp में ढाला नहीं जा सकता

+0

पोस्ट अपने कोड और स्टैक ट्रेस – Abubakkar

+0

java.lang.ClassCastException: oracle.sql.TIMESTAMP java.sql.Timestamp java.lang.ClassCastException में ढाला नहीं जा सकते हैं: oracle.sql.TIMESTAMP java.sql में ढाला नहीं जा सकता है। Com.sun.rowset.CachedRowSetImpl.getDate (CachedRowSetImpl.java:2139) पर टाइमस्टैम्प –

+0

अपना कोड भी पोस्ट करें और संपूर्ण स्टैक ट्रेस – Abubakkar

उत्तर

0

मुझे लगता है कि समस्या आपकी setLastUpdatejava.sql.Date प्रकार की ऑब्जेक्ट की अपेक्षा कर रही है।

अब आप agent.setLastUpdate(res.getDate(3));

res.getDate(3) का उपयोग एक वस्तु है कि आपके विधि उम्मीद नहीं है तो अपने वहाँ उस के लिए ClassCastException हो सकता है लौटने किया जाना चाहिए जब।

इस कोड का प्रयास करें और देखें कि क्या यह हल करती है आपकी समस्या है या नहीं: क्योंकि oracle.sql.TIMESTAMPjava.sql.TIMESTAMP से प्राप्त नहीं है

agent.setLastUpdate(new java.util.Date(res.getDate(3).getTime())); 
1

यह है:

java.lang.Object 
    -> oracle.sql.Datum 
    -> oracle.sql.TIMESTAMP 

आप डाली नहीं कर सकता बाद में पूर्व में।

इसके बजाय oracle.sql.TIMESTAMP.timestampValue() का उपयोग करें:

public Timestamp timestampValue(Calendar cal) throws SQLException 

कॉल toTimestamp एक जावा Timestamp करने के लिए आंतरिक ओरेकल Date बदलने और कैलेंडर के लिए।

4

मुझे एक रास्ता मिल गया।

oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject("last_update"); 
agent.setLastUpdate(new Date(ts.dateValue().getTime())); 
0

सबसे अधिक संभावना आप getTIMESTAMP() बजाय getTimestamp() इस्तेमाल किया। तरीकों getTIMESTAMP() (और getDATE(), नहीं तो आप एक JDBC ड्राइवर का उपयोग नहीं कर रहे हैं, तो OracleResultSet में विस्तार जो ओरेकल विशिष्ट प्रकार वापसी कर रहे हैं।

क्योंकि getDate() की returntype java.sql.Date है और getTimestamp() की java.sql.Timestamp है, इसलिए यह नहीं किया जा सकता आपके प्रश्न में एक बिल्कुल अलग प्रकार है।

18

ResultSet.getObject() जनादेश कि JDBC प्रकार एक जावा प्रकार के रूप में JDBC कल्पना द्वारा निर्धारित मैप किया जाना चाहिए के लिए जावाडोक (TIMESTAMP -> java.sqlTimestmp):

इस विधि को देखते हुए का मूल्य वापस आ जाएगी जावा ऑब्जेक्ट के रूप में कॉलम। जावा ऑब्जेक्ट का प्रकार जेडबीसी विनिर्देश में निर्दिष्ट अंतर्निहित प्रकारों के लिए मानचित्रण के बाद, कॉलम के SQL प्रकार के अनुरूप डिफ़ॉल्ट जावा ऑब्जेक्ट प्रकार होगा।

आपने गौर किया है, ओरेकल ड्राइवर डिफ़ॉल्ट मानक साथ नहीं शिकायत कर रहा है और इसके बजाय oracle.sql.TIMESTAMP का उपयोग करता है (java.sql.Timestamp विस्तार नहीं करता है)। एक बार जब आप इस, getResult कर

java -Doracle.jdbc.J2EE13Compliant=true YourApplication 

है या प्रोग्रामेटिक

System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true") 

: अच्छी खबर यह है कि आप वीएम स्टार्टअप के दौरान true को oracle.jdbc.J2EE13Compliant प्रणाली संपत्ति की स्थापना द्वारा JDBC अनुपालन के लिए मजबूर कर सकते हैं() अपेक्षित के रूप में java.sql.Timestamp के उदाहरण वापस करेगा।

अधिक जानकारी के लिए Oracle JDBC Driver Documentation से संबंधित अनुभाग देखें, जो oracle.jdbc.J2EE13Compliant को सेट करने के कई तरीकों का वर्णन करता है।

+1

विन्सेंट का जवाब बताता है कि अपवाद क्यों उठाया गया है, लेकिन यह (बोगदान का) उत्तर मूल कोड को java.sql.Timestamp ऑब्जेक्ट के बजाय oracle.sql.Timestamp ऑब्जेक्ट देख रहा है। यदि आप जानते हैं कि आप हमेशा J2EE13 कॉम्पलेंट प्रॉपर्टी सेट चाहते हैं, तो आप इसे 'Properties props = System.getProperties() का उपयोग करके कोड में कर सकते हैं; props.setProperty ("oracle.jdbc.J2EE13Compliant", "सत्य"); ' – drootang

1

यह oracle.sql.TIMESTAMP कक्षा में मौजूद timestampValue() फ़ंक्शन का उपयोग करके हल किया जा सकता है। यह विधि orava.sql.TIMESTAMP को java.sql.Timestamp में परिवर्तित कर देगी।

oracle.sql.TIMESTAMP ts = (oracle.sql.TIMESTAMP) res.getObject ("last_update"); agent.setLastUpdate (ts.timestampValue());

संबंधित मुद्दे

 संबंधित मुद्दे