我们需要能够动态更改报表生成器中构建/管理的报表的数据源。基本上它的数据库结构相同,但每个客户端都有自己的数据库,因此根据 ClientID 的参数,它需要动态转到相应的数据库。
有人对此有什么好的解决方案吗?
我们需要能够动态更改报表生成器中构建/管理的报表的数据源。基本上它的数据库结构相同,但每个客户端都有自己的数据库,因此根据 ClientID 的参数,它需要动态转到相应的数据库。
有人对此有什么好的解决方案吗?
您可以创建一个存储过程,根据传递的参数动态地从不同的数据库中提取数据,而不是动态地更改数据源(我什至不确定这是否可能)。
CREATE PROCEDURE ProcedureName
-- Add the parameters for the stored procedure here
@clientName nvarchar(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
declare @sql nvarchar(max)
set @sql='select * from ' + @clientName + '.dbo.Products'
exec(@sql)
END
GO
这类似于将报表模型部署到服务器的问题。您可以通过采用如下所述的架构来完成(我认为)您需要的东西。
在报告服务器上为每个客户端创建一个文件夹,. 适当设置权限,以便客户端无法运行彼此的报告。在此文件夹下放置一个名为“数据源”或类似名称的文件夹,并将所有报告的数据源放在此文件夹中。这意味着任何以编程方式重新连接数据源的工具都知道数据源相对于报表的确切位置。请注意,数据源还应具有特定的、可预测的名称。
编写一个小的 .net 应用程序来部署报表、数据源和报表模型。这比听起来容易,因为 SSRS 导出了一个相当简单的 Web 服务来执行此操作。
IronPython 是一个很好的方法来试验这个 Web 服务并弄清楚如何驱动它。为此,您需要使用 WSDL 包装器生成器 (WSDL.EXE IIRC) 并制作一些 C# 存根。编译存根并将库注册到 IronPython。然后使用交互式 shell 来试验 Web 服务 API。如果您有这种倾向,请用 C# 重写。
还有一个与 SSRS 捆绑在一起的工具,称为 rs.exe,它获取一个 VB.net 文件,对其进行顶部和尾部并编译结果,以便您可以使用 VB.net 编写与报表服务器一起使用的脚本。
此 .net 应用程序将部署报告并连接数据源。对其进行设置,使其可以部署在任何给定文件夹下。当您设置客户时,请在您创建他们的文件夹时设置的“数据源”文件夹下设置他们的数据源。您可以以编程方式部署报告文件,并通过几行代码将其连接到数据源。在客户端文件夹下部署报告。
通过命令行下的服务器名称和目录进行参数化,应用程序可以部署报告并将其数据源连接到“数据源”文件夹下的数据源。报告中对数据源的引用可以具有相对路径,因此报告可以很高兴地不知道它们在层次结构中的位置。
将其包装在批处理文件中或使用其他方式自动部署整套报告。作为奖励,这使得部署到测试环境变得容易。对于额外的奖励积分,您可以扩展应用程序,以便它可以遍历客户根目录下的任意目录并下载它在那里找到的报告。
部署报表模型是相似的,但有一个额外的变化。报表模型的属性之一是依赖于它的报表列表。您将需要捕获此列表(同样,这很容易以编程方式完成)并将报表重新连接到数据源(报表模型是这些报表的数据源)。
这允许您部署(或克隆,如果您已实现下载功能)任何报告套件,并以编程方式将它们部署到服务器上特定于客户端的目录。它还为您提供了一个简单的安全模型,因为您可以通过客户端的根目录保护对报告的访问。