我在SQL
Java
中获得了Oracle DB
个结果集,我想知道是否以及如何在Java
中记录/捕获SQL错误。所以当我尝试执行一些SQL
时:
ResultSet resultSet = connection.executeQuery(query);
我收到ORA-00942: table or view does not exist
之类的错误。我怎么能记录下来?
答案 0 :(得分:4)
使用catch
语句根据需要存储正确的SQL异常:
try (ResultSet rs = statement.executeQuery(query)) {
/* retrieve the data */
} catch (SQLException e) {
/* handle the exception properly */
storeExceptionSomewhereElse(e);
}
//...
public void storeExceptionSomewhereElse(SQLException e) {
/*
Here you can store the exception in database
or external data source.
*/
}
答案 1 :(得分:0)
如果你想要一个更强大的解决方案并且会记录executeQuery的每个异常,通过实现所述接口,然后代理对真实连接对象的调用,为Connection和Statement创建包装类。更改用于获取连接的逻辑,并将原始连接作为construtor争论传递。像这样:
public class WrapperConnection implements java.sql.Connection {
public Connection _realConn;
public WrapperConnection(Connection realConnection) {
_realConn = realConnection;
}
@Override
public Statement createStatement() throws SQLException {
return new WrapperStatement(_realConn.createStatement());
}
...lots of other implmented proxy methods...
}
和Statement对象:
public class WrapperStatement implements Statement {
public Statement _realStmt;
public WrapperStatement(Statement realStmt) {
_realStmt = realStmt;
}
@Override
public ResultSet executeQuery(String sql) throws SQLException {
try {
return _realStmt.executeQuery(sql);
} catch(SQLException sqlEx) {
logSQLException(sqlEx);
throw sqlEx;
}
}
...lots of other implemented proxy calls...
}
繁琐的部分是你必须在接口中实现所有其他调用,但它们非常简单,基本上将每次调用代理传递给传递给构造函数的“真实”对象;然后,这将使您有机会记录每种类型的调用(获取准备调用等)。您还可以使用它来记录通过executeQuery()执行的SQL,并将其与异常相关联扔了。
答案 2 :(得分:0)
您可以使用try-catch来获取错误。然后,您可以设置记录器来记录异常。
例如:
catch(SqlException e){
Logger.LogDB("Record1: "+ e);
}