SQL Server 2005报表生成器如何动态更改数据源?

时间:2009-05-11 15:31:11

标签: sql-server-2005 reporting-services reportbuilder

我们需要能够动态更改报表生成器中构建/管理的报表的数据源。基本上它是相同的DB结构,但每个客户端都有自己的DB,因此根据ClientID的参数,它需要动态转到相应的DB。

有人对此有什么好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个存储过程,根据传递的参数动态提取不同数据库中的数据,而不是动态地查找datsource(我甚至不确定是否可能)。

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

答案 1 :(得分:1)

这类似于将报表模型部署到服务器的问题。您可以通过采用如下所述的体系结构来完成您所需的(我认为)。

  • 为报告服务器上的每个客户端创建一个文件夹。适当设置权限,以便客户端无法运行彼此的报告。在此文件夹下放置一个名为“数据源”的文件夹或其他文件夹,并将所有报告的数据源放在此文件夹中。这意味着以编程方式重新连接数据源的任何工具都可以准确地知道数据源相对于报告的位置。请注意,数据源还应具有特定的,可预测的名称。

  • 编写一个小的.net应用程序来部署报告,数据源和报告模型。这比听起来更容易,因为SSRS导出了一个相当简单的Web服务来执行此操作。

  • IronPython是尝试使用此Web服务并找出如何驱动它的好方法。为此,您需要使用WSDL包装器生成器(WSDL.EXE IIRC)并制作一些C#存根。编译存根并使用IronPython注册库。然后使用交互式shell来试验Web服务API。如果您有这种倾向,请在C#中重写。

  • 还有一个名为rs.exe的SSRS捆绑工具,它接受一个VB.net文件,顶部和尾部并编译结果,这样你就可以使用VB.net编写带有报表服务器的脚本

此.net应用程序将部署报告并连接数据源。将其设置为可以在任何给定文件夹下部署。设置客户时,请在创建文件夹时设置的“数据源”文件夹下设置其数据源。您可以以编程方式部署报表文件,并使用几行代码将数据源连接到该文件。在客户端的文件夹下部署报告。

通过命令行中的服务器名称和目录进行参数化,应用程序可以部署报告并将其数据源连接到“数据源”文件夹下的数据源。报告中对数据源的引用可以具有相对路径,因此报告可以幸福地不知道它们在层次结构中的位置。

将其包装在批处理文件中或使用其他方法自动部署整套报告。作为奖励,这使得部署到测试环境变得容易。对于额外的奖励积分,您可以扩展应用程序,以便它可以在客户的根目录下遍历任意目录并下载它在那里找到的报告。

部署报告模型类似,但有一个额外的扭曲。报告模型的一个属性是依赖于它的报告列表。您需要捕获此列表(再次,这可以直接以编程方式进行)并将报告重新连接到数据源(报告模型 这些报告的数据源)。

这允许您部署(或克隆,如果您已实现下载功能)任何报告套件,并以编程方式将它们部署到服务器上特定于客户端的目录中。它还为您提供了一个简单的安全模型,因为您可以通过客户端的根目录来保护对报告的访问。