5

Access データベースの操作に UCanAccess を使用しています。呼び出すexecuteUpdateと、例外が発生します。

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::3.0.2 予期しないページ タイプ 1 (Db=db.accdb;Table=MyTable;Index=PrimaryKey)

特定の行を更新しようとしたときにのみ発生します-Access DBでこれを修正する方法はすでに知っています。

問題はロガーにあります。この例外がスローされてキャッチした後、情報メッセージをログに記録しましたが表示されず、次のログ メッセージもすべて表示されません。

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;Table=myTable;Index=PrimaryKey) net.ucanaccess.commands.CompositeCommand.persist(CompositeCommand.java:95) ) net.ucanaccess.jdbc.UcanaccessConnection.flushIO(UcanaccessConnection.java:315) で net.ucanaccess.jdbc.UcanaccessConnection.commit(UcanaccessConnection.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: com.healthmarketscience.jackcess.impl.IndexData の予期しないページ タイプ 1 (Db=db.accdb;Table=myTable;Index=PrimaryKey)。isLeafPage(IndexData.java:1185) com.healthmarketscience.jackcess.impl.IndexData.readDataPage(IndexData.java:1067) com.healthmarketscience.jackcess.impl.IndexPageCache.readDataPage(IndexPageCache.java:267) com.healthmarketscience .jackcess.impl.IndexPageCache.getDataPage(IndexPageCache.java:224) com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage(IndexPageCache.java:211) で ....java:211) ………………java:211) ………………

内部例外

私のログファイルには、次の行のみが含まれています。

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

これは、ロガーがアクティブでなくなったことを意味します。UCanAccess の例外の前に、いくつかのロガーの変更があると思います。

4

1 に答える 1