Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql BIRT报告数据库设置为参数,但参数需要数据库?_Mysql_Database_Eclipse_Parameters_Birt - Fatal编程技术网

Mysql BIRT报告数据库设置为参数,但参数需要数据库?

Mysql BIRT报告数据库设置为参数,但参数需要数据库?,mysql,database,eclipse,parameters,birt,Mysql,Database,Eclipse,Parameters,Birt,我有一种感觉,我在这里陷入了第22条军规的境地,但我在这里发帖,希望至少有人找到了解决这个问题的办法 我处理的BIRT报告的数据库是通过一个名为db的隐藏参数传入的,因此在我报告的数据源中。因此,在属性绑定下,我告诉BIRT使用jdbc:mysql://localhost/“+params[“db”].value作为JDBC驱动程序URL。这应该使用在浏览器中运行时从URL传入的数据库名称,这是我在网上找到的一个解决方案,用于在具有不同数据库名称的计算机上运行报告 我的问题是,在相同的报告参数

我有一种感觉,我在这里陷入了第22条军规的境地,但我在这里发帖,希望至少有人找到了解决这个问题的办法

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

我的问题是,在相同的报告参数中,用户必须从来自数据库的公司列表中选择一个公司。但报告无法填充此列表,因为只有在我按下“参数”窗口上的“确定”按钮后,数据库才会加载,而在他们选择一家公司之前,这是无法完成的,哦,我发现自己陷入了第22条军规的境地


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

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

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


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

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

因此,应使用不同的方法提供数据库。您在这里有几个选项:

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

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

reportContext.getHttpServletRequest().getSession().getAttribute("db");
  • 优点1:每个用户的数据库可能不同
  • 优点2:可以为每个用户动态更改数据库
  • 缺点:需要开发一个小型servlet,允许选择数据库并将其存储在用户会话中
选项2:连接池(如果使用应用程序服务器) 这应该是使用BIRT访问JDBC数据源的最常用方式。我们只需要在数据源中填充一个JNDI URL(参见上面的第一个屏幕)。物理数据库URL和凭据在连接池中的每个应用程序服务器上定义

  • 优点1:完全是本地的,没有特定的开发
  • 优点2:连接池比直接访问JDBC更高效
  • 优点3:连接池可防止“连接过多”问题
  • 优点4:我们不必在报告中硬编码数据库URL和凭据
  • 缺点:此JNDI URL由所有用户共享
访问查看将连接池与BIRT一起使用的示例

选项3:在属性文件中外部化DB

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

  • 优点1:我们不必在报告中硬编码数据库URL和凭据
  • 优点2:我们还可以开发一个小servlet,通过GUI更新这个属性文件
  • 缺点:此数据库由所有用户共享
请查看如何通过报表的资源访问属性文件

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

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

请检查如何定义连接存储

自从发布此问题以来,我似乎必须采取与此处发布的类似的方法:使用带有数据库信息的外部属性文件,并使用beforeOpen加载它。我以前创建过一个属性文件,但是我不确定两件事:在我们的计算机上保存这个属性文件的位置,以及如何将代码指向它?如果有人能澄清,对我来说,这将是非常感谢,我会张贴这作为一个答案,然后如果它的工作为未来的参考。