我正在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)
我知道这个话题:
由于我的报告数据源只是定义了JDBC类com.ibm.db2.jcc.DB2Driver
和JNDI URL
,因此它使用 WAS数据源。我确实尝试将allowNextOnExhaustedResultSet
自定义属性作为整数值1添加到数据源,但这对我没有任何修复。据说这只是一种解决方法。
我在BIRT论坛上询问是否会修复,没有回复?正如IBM所建议的那样 - 如果没有记录或没有更多记录,修改应用程序代码以避免调用ResultSet.next。这是针对ResultSet类的BIRT数据引擎代码。
同时还有更多的解决方法吗?
可能还值得一提的是,这在 BIRT 4.2.0上没有问题
答案 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,这是当且仅当异常发生时。为了解决这个问题,我使用表元素和相同的聚合表达式创建了相同的布局和结果报告,并且在没有返回结果时不再接收异常。