Tôi đang sử dụng UCanAccess để thao tác với cơ sở dữ liệu Access. Khi gọi executeUpdate
tôi nhận được ngoại lệ:UCanAccess/ngoại lệ xử lý khi gọi executeUpdate vô hiệu hóa đầu ra Logger của tôi
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 bất ngờ loại trang 1 (Db = db.accdb; Bảng = MyTable; Index = PrimaryKey)
Nó chỉ xảy ra khi cố gắng cập nhật một hàng cụ thể - Tôi đã biết cách khắc phục điều này trong DB truy cập.
Vấn đề là với Logger, sau khi ngoại lệ này được ném và tôi bắt nó, tôi đăng nhập một thông báo và nó không được hiển thị, tất cả các thông điệp tường trình tiếp theo cũng không được hiển thị.
Lý do tại sao tôi muốn sửa nó mà không sửa DB là vì khi nó xảy ra một lần, người dùng nên đóng ứng dụng để ghi lại các hành động tiếp theo, nếu không thì tôi sẽ không thể biết anh ấy đã làm gì.
Đây là mã của tôi:
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");
}
}
Giao diện điều khiển đầu ra là:
net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.2 bất ngờ loại trang 1 (Db = db .accdb; Bảng = myTable; Index = PrimaryKey) tại net.ucanaccess.commands.CompositeCommand.persist (CompositeCommand.java:95) tại net.ucanaccess.jdbc.UcanaccessConnection.flushIO (UcanaccessConnection.java:315) tại net .ucanaccess.jdbc.UcanaccessConnection.commit (Ucanacce ssConnection.java:205) tại net.ucanaccess.jdbc.AbstractExecute.executeBase (AbstractExecute.java:161) tại net.ucanaccess.jdbc.ExecuteUpdate.execute (ExecuteUpdate.java:50) tại net.ucanaccess.jdbc. UcanaccessPreparedStatement.executeUpdate (UcanaccessPreparedStatement.java:253) tại rashi.NewClass.main (NewClass.java:61) Gây ra bởi: java.io.IOException: Loại trang không mong muốn 1 (Db = db.accdb; Table = myTable; Index = PrimaryKey) tại com.healthmarketscience.jackcess.impl.IndexData.isLeafPage (IndexData.java:1185) tại com.healthmarketscience.jackcess.impl.IndexData.readDataPage (IndexData.java:1067) tại com.healthmarketscience.jackcess .impl.IndexPageCache.readDataPage (IndexPageCache.java:267) tại com.healthmarketscience.jac kcess.impl.IndexPageCache.getDataPage (IndexPageCache.java:224) tại com.healthmarketscience.jackcess.impl.IndexPageCache.getCacheDataPage (IndexPageCache.java:211) ..............
INSIDE Exception
Và tập tin đăng nhập của tôi chỉ chứa hàng này:
Sun Dec 20 15:35:40 IST 2015--1
có nghĩa logger của tôi là không còn hoạt động. Tôi đoán có một số thay đổi logger trước khi ngoại lệ trong UCanAccess.
Trong chương trình thực tế của bạn, là logger tuyên bố tĩnh thức như vậy mà nó không thể được thu gom rác thải? – jmehrens
chương trình thực tế của tôi chứa nhật ký cuối cùng tĩnh. Tôi đã tạo tệp truy cập db với ngoại lệ đó, tôi sẽ tải nó lên sau. Trong khi đó, bất kỳ đề xuất nào để sử dụng một cơ sở dữ liệu nhỏ gọn khác, điều đó sẽ không yêu cầu những thay đổi lớn trong mã? Tôi không muốn các lỗi này xảy ra khi ứng dụng đang trong quá trình sản xuất (vì tôi đã cố gắng "nhỏ gọn và sửa chữa" và nhiều hàng đã bị xóa). –
Tôi đã quản lý để tạo một tệp .mdb (bị hỏng) tái tạo sự cố của bạn và đã báo cáo sự cố với nhóm phát triển UCanAccess. –