2

我是Birt的新手。

我正在尝试将连接从我的 java 应用程序传递给报告,但出现错误:

以下项目有错误:

ReportDesign (id = 1): + 评估脚本“importPackage(Packages.it.lfiammetta.birt); var conn = new ReportRenderer(); reportContext.getAppContext().put("OdaJDBCDriverPassInConnection", conn);”时出错:在函数 __bm_beforeOpen() 中执行脚本失败。资源:

" + importPackage(Packages.it.lfiammetta.birt); var conn = new ReportRenderer(); reportContext.getAppContext().put("OdaJDBCDriverPassInConnection", conn); + "

发生 BIRT 异常。有关详细信息,请参阅下一个例外。评估 Javascript 表达式时出错。脚本引擎错误:ReferenceError:未定义“ReportRenderer”。(/report/data-sources/oda-data-source[@id="43"]/method[@name="beforeOpen"]#2) 脚本来源:/report/data-sources/oda-data-source[ @id="43"]/method[@name="beforeOpen"],行:0,文本:__bm_beforeOpen()。(元素 ID:1)

这是我创建和启动报告的 java 代码:

package it.lfiammetta.birt;

public class ReportRenderer {
        public void executeReport() {
                code...

                Map<String, Object> appContext = task.getAppContext();
                appContext.put("OdaJDBCDriverPassInConnection", myConnection);
                appContext.put("OdaJDBCDriverPassInConnectionCloseAfterUse", false);
                task.setAppContext(appContext);

                task.run();

                code...
        }
}

这是我在脚本“beforeOpen”数据源中编写的代码:

importPackage(Packages.it.lfiammetta.birt);

var conn = new ReportRenderer(); 
reportContext.getAppContext().put("OdaJDBCDriverPassInConnection", conn);

我设置了类路径。

我使用的Birt版本是4.2.1。

提前感谢您的帮助,我为我的英语道歉。

4

2 回答 2

2

我正在从 Java 代码中执行此操作(IJDBCParameters- 实际上是 JDBC 连接的参数,我正在按名称查找连接 - OdaDataSourceHandle.getName()):

@SuppressWarnings("rawtypes")
private static void substituteJDBCConnections(IReportRunnable pReportRunnable) {
    final Map<String, IJDBCParameters> jdbcConnections = reportParameters.getJdbcConnections();
    if (jdbcConnections != null ){
        for (Iterator iter = pReportRunnable.getDesignHandle().getModuleHandle().getDataSources().iterator(); iter.hasNext();){
            // http://wiki.eclipse.org/Java_-_Execute_Modified_Report_(BIRT)
            Object element = iter.next();
            if (element instanceof OdaDataSourceHandle){
                OdaDataSourceHandle dsHandle = (OdaDataSourceHandle) element;
                String key = dsHandle.getName();
                if (key == null){
                    continue;
                }
                IJDBCParameters jdbcParams = jdbcConnections.get(key);
                if (jdbcParams == null){
                    continue;
                }
                try {
                    dsHandle.setProperty( "odaDriverClass", jdbcParams.getDriverName());
                    dsHandle.setProperty( "odaURL", jdbcParams.getConnectionString());
                    dsHandle.setProperty( "odaUser", jdbcParams.getUserName());
                    dsHandle.setProperty( "odaPassword", jdbcParams.getPassword());
                } catch (SemanticException e) {
                    throw new UncheckedException(e);
                }
            }
        }
    }
于 2013-03-15T09:25:57.130 回答
2

可能您已经解决了您的问题,但也许将来有人会寻找这个。首先,4.2.x 版本在传递连接方面存在问题。我在 4.4.2 中没有观察到同样的错误。

另一件事,我不明白您为什么要尝试ReportRenderer作为连接传递:

var conn = new ReportRenderer();
reportContext.getAppContext().put("OdaJDBCDriverPassInConnection", conn);

这里传入的对象应该是一个java.sql.Connection对象。

所以,

Map<String, Object> appContext = task.getAppContext();
appContext.put("OdaJDBCDriverPassInConnection", myConnection);
appContext.put("OdaJDBCDriverPassInConnectionCloseAfterUse", false);
task.setAppContext(appContext);

看起来是正确的,只要myConnection是一个实现java.sql.Connection

于 2015-07-02T14:22:12.560 回答