在JDBC中,Connection
,Statement
和ResultSet
类型都有一个getWarnings()
方法,该方法被指定用于生成与该类型对象关联的第一个警告。第二个及后续警告(如果存在)将链接到第一个警告(如果它甚至存在,如果没有警告,则会生成null
。)
规范说明在某些操作后,与这些类型的对象关联的警告会被清除。例如,当读取每个新行时,ResultSet
上的警告将被清除。
SQLWarning
类型是SQLException
的子类型。那么,例外是否会出现警告?如果异常的运行时类型为SQLWarning
?
我想知道的是,这可能是特定于驱动程序的,我如何知道何时应该致电getWarnings()
并期待非null
响应?换句话说,JDBC对象上是否存在警告,只有在该对象抛出异常后才能使用getWarnings()
? (那个例外就是警告?)
如果我的目标是观察每个警告,我是否应该在每次JDBC操作后调用getWarnings()
来查找警告“只是为了确定”?
答案 0 :(得分:7)
SQLWarning
个对象是SQLException
的子类,用于处理数据库访问警告。
警告不会像例外那样停止执行应用程序;他们只是提醒用户,事情没有按计划发生。
可以在Connection
对象,Statement
对象(包括PreparedStatement
和CallableStatement
个对象)或ResultSet
对象上报告警告。< / p>
每个类都有一个getWarnings
方法,您必须调用该方法才能看到调用对象上报告的第一个警告:
SQLWarning warning = stmt.getWarnings();
if (warning != null)
{
System.out.println(\"n---Warning---n\");
while (warning != null)
{
System.out.println(\"Message: \" + warning.getMessage());
System.out.println(\"SQLState: \" + warning.getSQLState());
System.out.print(\"Vendor error code: \");
System.out.println(warning.getErrorCode());
System.out.println(\"\");
warning = warning.getNextWarning();
}
}
答案 1 :(得分:4)
坦率地说,我从未发现自己一直在检查警告。可能是我从未做过任何严肃的事情。另一方面,你必须明确 检查是否有任何SQL警告,因为 它们不是通过传播的 标准的异常处理 机制。为此,请致电 适当的getWarnings方法 相关的JDBC对象。
答案 2 :(得分:3)
是的,如果你真的想要观察每一个警告,你需要明确地获得警告。但是你为什么要做这样的事呢?
或者Spring的JdbcTemplate为您提供了在有警告时记录警告或抛出SQLWarningException的选项。默认行为是记录警告,因为它们是警告。希望这也足以满足您的目的。