【问题标题】:BIRT report database set as parameter, but parameter requires the database?BIRT报告数据库设置为参数,但参数需要数据库?
【发布时间】:2014-08-27 13:45:01
【问题描述】:

我觉得我在这里遇到了第 22 条问题,但我发帖是希望有人至少找到解决方法!

我处理的 BIRT 报告的数据库是通过一个名为 db 的隐藏参数传入的,因此在我的报告的数据源中。所以在属性绑定下,我告诉 BIRT 使用"jdbc:mysql://localhost/" + params["db"].value 作为 JDBC 驱动程序 URL。这应该使用在浏览器运行时从 URL 传入的数据库名称,这是我在网上找到的一个解决方案,用于在具有不同数据库名称的计算机上运行我们的报告。

我的问题是,在相同的报告参数中,用户必须从来自数据库的公司列表中选择一家公司。但是报告无法填充此列表,因为直到我在参数窗口上按 OK 才加载数据库,直到他们选择了一家公司才能完成,而且哦,我发现自己遇到了 catch-22 的情况!

我不知道在这种情况下我应该做什么,我怎样才能让报告先加载数据库,然后根据它显示参数屏幕?

【问题讨论】:

  • 自从发布此问题后,我似乎将不得不采取类似于此处发布的路线:link 使用带有数据库信息的外部属性文件,并利用 beforeOpen 加载它。我之前创建了一个属性文件,但是我不确定两件事:在我们的计算机上将这个属性文件保存在哪里,以及如何将这个代码指向它?如果有人可以澄清对我来说将不胜感激,我会将其作为答案发布,然后如果它适用于将来的参考。

标签: mysql database eclipse parameters birt


【解决方案1】:

据我所知,我们不能这样做,因为 BIRT 中的两个报告参数之间没有依赖机制,级联参数除外。在这种情况下,这意味着在评估“公司”的项目列表时,参数“db”的选定值永远不可用。

因此,应使用不同的方法提供数据库。你有几个选择:

选项 1:会话属性(如果您使用应用服务器)

将选定的数据库存储在用户会话属性中,然后使用如下表达式在 JDBC URL 的属性绑定中检索它:

reportContext.getHttpServletRequest().getSession().getAttribute("db");
  • 优势一:每个用户的数据库可以不同
  • 优势二:数据库可以为每个用户动态改变
  • 缺点:需要开发一个小 servlet,允许选择数据库并将其存储在用户会话中

选项 2:连接池(如果您使用应用程序服务器) 这应该始终是使用 BIRT 访问 JDBC 数据源的最喜欢的方式。我们只需在数据源中填写一个 JNDI URL(参见上面的第一个屏幕)。物理数据库 URL 和凭据在连接池中的每个应用程序服务器上定义。

  • 优势 1:完全原生,无需专门开发
  • 优势 2:连接池比直接访问 JDBC 效率更高
  • 优势 3:连接池可防止“连接过多”问题
  • 优势 4:我们不必在报告中硬编码数据库 URL 和凭据
  • 缺点:此 JNDI URL 由所有用户共享。

访问this article 以查看将连接池与 BIRT 结合使用的示例。

选项 3:在属性文件中外部化数据库

正如你提到的,数据库信息也可以在文件中外部化。

  • 优势 1:我们不必在报告中硬编码数据库 URL 和凭据
  • 优势 2:我们还可以开发一个小的 servlet 来通过 GUI 更新这个属性文件
  • 缺点:此数据库由所有用户共享。

请查看this topic,了解如何通过报表资源访问属性文件

选项 4:连接配置文件存储

  • 优势:我们不必在报告中硬编码数据库 URL 和凭据
  • 缺点:此数据库由所有用户共享。

请查看this topic 了解如何定义连接存储

【讨论】:

    【解决方案2】:

    为了他人的利益,在这里回答我自己的问题。此问题的最佳解决方案是使用此 stackoverflow 线程 link 中所述的外部连接配置文件属性文件。这最初对我们不起作用,因为我无法弄清楚如何让报告文件查找属性文件,而不管它在哪台计算机上运行。但是我发现在加载/保存属性文件时可以指定绝对路径(对于 BIRT 4.4.0,这是在数据源的连接配置文件下的浏览按钮旁边的下拉菜单下)。这允许文件一旦保存在相同的绝对路径下,就可以在任何计算机上读取。

    另一个需要注意的重要事情是 BIRT 有一个奇怪的习惯,即更改它将使用 3 种加载数据源的方法中的哪一种。在我们的测试过程中我们发现,如果我们在使用连接配置文件时没有将属性绑定设置留空,BIRT 似乎会随机选择通过参数加载或根据最后编辑的属性文件加载,非常混乱!

    仍然可以使用参数来指定数据库,只是用途非常有限。到目前为止,它一直对我们有用,因为虽然我们将数据库设置为参数,但始终在 JDBC 中设置相同的数据库,报告用于填充公司参数。但我们不再需要手动设置该数据库,现在它将自动加载而没有问题(希望如此!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-21
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多