何时使用JDBC调用Connections,Statements和ResultSet上的getWarnings()?

时间:2011-06-22 02:44:36

标签: java sql database jdbc warnings

在JDBC中,ConnectionStatementResultSet类型都有一个getWarnings()方法,该方法被指定用于生成与该类型对象关联的第一个警告。第二个及后续警告(如果存在)将链接到第一个警告(如果甚至存在,如果没有警告,则会生成null。)

规范说明在某些操作后,与这些类型的对象关联的警告会被清除。例如,当读取每个新行时,ResultSet上的警告将被清除。

SQLWarning类型是SQLException的子类型。那么,例外是否会出现警告?如果异常的运行时类型为SQLWarning

,则该异常将链接到关联对象

我想知道的是,这可能是特定于驱动程序的,我如何知道何时应该致电getWarnings()并期待非null响应?换句话说,JDBC对象上是否存在警告,只有在该对象抛出异常后才能使用getWarnings()? (那个例外就是警告?)

如果我的目标是观察每个警告,我是否应该在每次JDBC操作后调用getWarnings()来查找警告“只是为了确定”?

3 个答案:

答案 0 :(得分:7)

SQLWarning个对象是SQLException的子类,用于处理数据库访问警告。

警告不会像例外那样停止执行应用程序;他们只是提醒用户,事情没有按计划发生。

可以在Connection对象,Statement对象(包括PreparedStatementCallableStatement个对象)或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对象。

[reference]

坦率地说,我从未发现自己一直在检查警告。可能是我从未做过任何严肃的事情。

答案 2 :(得分:3)

是的,如果你真的想要观察每一个警告,你需要明确地获得警告。但是你为什么要做这样的事呢?

或者Spring的JdbcTemplate为您提供了在有警告时记录警告或抛出SQLWarningException的选项。默认行为是记录警告,因为它们是警告。希望这也足以满足您的目的。