2015-12-20 6 views
5

मैं एक एक्सेस डेटाबेस जोड़ तोड़ के लिए UCanAccess उपयोग कर रहा हूँ अक्षम करता है।UCanAccess/Jackcess अपवाद है जब executeUpdate बुला मेरी लॉगर आउटपुट

net.ucanaccess.jdbc.UcanaccessSQLException: जब executeUpdate बुला मैं अपवाद UCAExc ::: 3.0.2 अप्रत्याशित पेज टाइप 1 (; तालिका = MyTable; Db = db.accdb सूचकांक = PrimaryKey)

यह केवल तब होता है जब एक विशेष पंक्ति को अद्यतन करने की कोशिश कर रहा - मैं पहले से ही जानते हैं कि कैसे पहुँच DB में इसे ठीक करने के। के बाद इस अपवाद फेंक दिया है

समस्या, लॉगर के साथ है और मैं इसे पकड़ने, मैं एक जानकारी संदेश लॉग इन करें और यह नहीं दिखाया गया है, अगले लॉग संदेशों के सभी या तो नहीं दिखाए जाते।

डीबी को ठीक किए बिना मैं इसे ठीक करना क्यों चाहता हूं क्योंकि जब यह एक बार होता है, तो उपयोगकर्ता को अगले कार्यों को लॉग इन करने के लिए एप्लिकेशन को बंद करना चाहिए, अगर वह नहीं जानता तो मैं नहीं जानता उसने क्या किया।

public static void main(String args[]) { 
    Logger logger = Logger.getLogger("myLogger"); 
    PreparedStatement pst = null; 
    try { 
     FileHandler fileHandler = new FileHandler("myLog.log", 0, 1, true); 

     // Set formatter to put the time, the message, and the exception if exists 
     fileHandler.setFormatter(new Formatter() { 
      @Override 
      public String format(LogRecord record) { 
       Throwable t = record.getThrown(); 
       String stackTrace = ""; 
       if (t != null) { 
        StringWriter sw = new StringWriter(); 
        t.printStackTrace(new PrintWriter(sw)); 
        stackTrace = sw.toString(); 
       } 

       return Calendar.getInstance().getTime() + "--" + 
         formatMessage(record) + stackTrace + "\n"; 
      } 
     }); 

     // Set the logger handler 
     logger.addHandler(fileHandler); 
     logger.log(Level.INFO, "1"); 

     // Throw on purpose 
     String query = "UPDATE myTable SET name = 'a' WHERE id = 289"; 

     conn = DriverManager.getConnection(DB_URL); 
     pst = conn.prepareStatement(query); 
     pst.executeUpdate(); 

     logger.log(Level.INFO, "2"); 
    } catch (UcanaccessSQLException e) { 
     logger.log(Level.INFO, "3"); 
     System.out.println("INSIDE Exception"); 
    } catch (SQLException e) { 
     logger.log(Level.INFO, "4"); 
    } catch (Exception e) { 
     logger.log(Level.INFO, "5"); 
    } 
} 

कंसोल आउटपुट है:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 अप्रत्याशित पेज टाइप 1 (Db = db

यह मेरा कोड है .accdb; तालिका = myTable; अनुक्रमणिका = प्राथमिक कुंजी) net.ucanaccess.commands.CompositeCommand.persistist (CompositeCommand.java:95) net.ucanaccess.jdbc.UcanaccessConnection.flushIO (UcanaccessConnection.java:315) पर नेट पर .ucanaccess.jdbc.UcanaccessConnection.commit (Ucanacce ssConnection.java:205) net.ucanaccess.jdbc.AbstractExecute.executeBase (AbstractExecute.java:161) पर net.ucanaccess.jdbc.ExecuteUpdate.execute (ExecuteUpdate.java:50) net.ucanaccess.jdbc पर पर। UcanaccessPreparedStatement.executeUpdate (UcanaccessPreparedStatement.java:253) rashi.NewClass.main (NewClass.java:61) के कारण: java.io.IOException: अप्रत्याशित पृष्ठ प्रकार 1 (डीबी = डीबी.एसीसीडीबी; तालिका = myTable; इंडेक्स = PrimaryKey) com.healthmarketscience.jackcess.impl.IndexData.isLeafPage (IndexData.java:1185) com.healthmarketscience.jackcess.impl.IndexData.readDataPage (IndexData.java:1067) com.healthmarketscience.jackcess पर .impl.IndexPageCache.readDataPage (IndexPageCache.java:267) com.healthmarketscience.jac पर kcess.impl.IndexPageCache.getDataPage (IndexPageCache.java 2424) com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage (IndexPageCache.java2111) ..............

पर

अंदर अपवाद

और मेरी लॉग फ़ाइल केवल इस पंक्ति में शामिल हैं:

Sun Dec 20 15:35:40 IST 2015--1 

जिसका अर्थ है मेरी लकड़हारा अब सक्रिय नहीं है। मुझे लगता है कि UCanAccess में अपवाद से पहले कुछ लकड़हारा परिवर्तन होते हैं।

+0

अपने वास्तविक कार्यक्रम में, लकड़हारा स्थिर अंतिम घोषित ऐसी है कि वह कचरा एकत्र नहीं किया जा सकता है? – jmehrens

+0

मेरे वास्तविक कार्यक्रम में स्थिर अंतिम लॉगर होता है। मैंने उस अपवाद के साथ एक्सेस डीबी फ़ाइल बनाई है, मैं इसे बाद में अपलोड कर दूंगा। इस बीच, किसी अन्य कॉम्पैक्ट डेटाबेस का उपयोग करने के लिए कोई सुझाव, जिसमें कोड में बड़े बदलाव की आवश्यकता नहीं होगी? मैं नहीं चाहता कि ये त्रुटियां तब आती हैं जब आवेदन उत्पादन में हो (क्योंकि मैंने "कॉम्पैक्ट और मरम्मत" करने की कोशिश की और कई पंक्तियां हटा दी गई हैं)। –

+0

मैं एक (क्षतिग्रस्त) .mdb फ़ाइल बनाने में कामयाब रहा जो आपकी समस्या को दोबारा शुरू करता है और इसे यूसीएएनएप विकास टीम को रिपोर्ट करता है। –

उत्तर

1

यह एक HSQLDB पक्ष प्रभाव है कि जब UCanAccess एक भौतिक रोलबैक कर रहे हैं और दर्पण db बंद हो रहा है होता है जैसा दिखता है।

सिस्टम प्रॉपर्टी सेट करना hsqldb.reconfig_logging से false समस्या को हल कर सकता है, उदा।,

-Dhsqldb.reconfig_logging=false 

या

System.setProperty("hsqldb.reconfig_logging", "false"); 
+0

System.setProperty ("hsqldb.reconfig_logging", "false"); मेरी समस्या का समाधान किया। जब मैं इस संपत्ति को सेट करता हूं, तो मेरा लॉगर अपने संदेश लिखना जारी रखता है। धन्यवाद! –

+0

मैं इसे डिफ़ॉल्ट के रूप में सेट कर सकता हूं, लेकिन इससे पहले कि मैं यह सुनिश्चित करना चाहता हूं कि इससे कुछ दुष्प्रभाव नहीं आएंगे। – jamadei

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