BIRT报告从数据集查询返回零结果时出现异常

时间:2014-05-06 14:04:38

标签: birt

我正在IBM WAS 8.5.5服务器上运行BIRT 4.3.2报告引擎。

当实际存在给定条件的结果时,报告会正常加载。如果没有结果,我会收到以下异常:

org.eclipse.birt.data.engine.odaconsumer.ResultSet fetch
SEVERE: Cannot fetch the next data row.
Throwable occurred: org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot move down to next row in the result set.
SQL error #1:Invalid operation: result set closed
com.ibm.db2.jcc.c.SqlException: Invalid operation: result set closed
    at org.eclipse.birt.report.data.oda.jdbc.ResultSet.next(ResultSet.java:198)

我知道这个话题:

developer.actuate.com/community/forum/index.php?/topic/25148-exception-is-thrown-when-there-is-no-data-retreived-from-query/

由于我的报告数据源只是定义了JDBC类com.ibm.db2.jcc.DB2DriverJNDI URL,因此它使用 WAS数据源。我确实尝试将allowNextOnExhaustedResultSet自定义属性作为整数值1添加到数据源,但这对我没有任何修复。据说这只是一种解决方法。

我在BIRT论坛上询问是否会修复,没有回复?正如IBM所建议的那样 - 如果没有记录或没有更多记录,修改应用程序代码以避免调用ResultSet.next。这是针对ResultSet类的BIRT数据引擎代码。

同时还有更多的解决方法吗?

可能还值得一提的是,这在 BIRT 4.2.0上没有问题

2 个答案:

答案 0 :(得分:2)

以下是 org.eclipse.birt.report.data.oda.jdbc.ResultSet.next

中涉及的代码片段
    try
    {
        /* redirect the call to JDBC ResultSet.next() */
        if ( currentRow < maxRows && rs.next( ) )
        {
            currentRow++;
            return true;
        }
        return false;
    }
    catch ( SQLException e )
    {
        throw new JDBCException(ResourceConstants.RESULTSET_CURSOR_DOWN_ERROR , e );
    }

正如您提供的链接所示,&#34; quick&#34;解决方法是检查结果集的状态&#34; if&#34;语句:

if ( currentRow < maxRows && !rs.isClosed() && rs.next( ) )
    {
        currentRow++;
        return true;
    }
return false;

当然需要在Eclipse中下载BIRT的源代码,有一个自动化的过程。我知道这可能不是你期望的那种解决方案,但它可能是唯一的解决方案。您不必编译整个BIRT项目,只需将此类导出为.jar并替换Eclipse中和BIRT运行时环境中的旧类。

将其作为bhat

的bugzilla中的补丁提交可能很有价值

答案 1 :(得分:1)

答案是,这可能是BIRT代码中的一个错误,可以通过升级到未来版本来修复。

我建议的工作是基于我发现异常的根本原因。

在4.2.0中,我在网格元素中使用了一个聚合表达式。更新到4.3.2,这是当且仅当异常发生时。为了解决这个问题,我使用表元素和相同的聚合表达式创建了相同的布局和结果报告,并且在没有返回结果时不再接收异常。