在服务器端以编程方式更改报告的SSRS数据源

Edd*_*lat 11 c# sql-server asp.net reportviewer reporting-services

今天,对于每个客户,我们部署相同的SSRS报告文件夹和数据源文件夹.这些文件夹之间的区别是每个文件夹的名称和数据源的连接字符串.

我们正在使用Report Server 2008 R2.

在报表呈现之前,是否可以仅维护一个报表和数据源文件夹并以编程方式更改其服务器端的连接字符串?

如果没有,是否可以通过更改报告中的某些逻辑来实现?今天我们使用"共享数据源"选项.

Ian*_*ton 10

这是我们在我们的环境中所做的事情 - 我们维护一组报告,这些报告可以在任何具有自己配置的客户端上部署.

你在这里有几个选择.由于您使用的是共享数据源,因此您无需为每个报表定义数据源,因此更加轻松.

1.使用rs.exe实用程序和脚本文件

联机丛书中的rs.exe

此程序允许您创建可与报表服务器Web服务交互的脚本文件(在VB.NET中).您创建一个脚本文件(例如Deploy.rss)并使用各种参数调用rs.exe程序,包括您定义的任何自定义参数:

rs.exe -i DeployReports.rss -s http://server/ReportServer -v DatabaseInstance="SQL" -v DatabaseName="ReportDB" -v ReportFolder="ClientReports"
Run Code Online (Sandbox Code Playgroud)

因此,这将调用脚本DeployReports.rss,连接到http://server/ReportServer三个用户定义的参数,这些参数可用于创建数据源和报告文件夹.

在scipt文件中你可以有这样的东西:

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    CreateFolder(reportFolder, "Report folder")
    CreateFolder(datasourceFolder, "Data source folder")
    CreateDataSource()

End Sub
Run Code Online (Sandbox Code Playgroud)

然后,可以进行以下Web服务调用:

rs.CreateFolder(folderName, "/", Nothing)

'Define the data source definition.
Dim definition As New DataSourceDefinition()
definition.CredentialRetrieval = CredentialRetrievalEnum.Integrated
definition.ConnectString = "data source=" + DatabaseInstance + ";initial catalog=" + DatabaseName
definition.Enabled = True
definition.EnabledSpecified = True
definition.Extension = "SQL"
definition.ImpersonateUser = False
definition.ImpersonateUserSpecified = True
'Use the default prompt string.
definition.Prompt = Nothing
definition.WindowsCredentials = False

Try

    rs.CreateDataSource(datasource, datasourcePath, False, definition, Nothing)
    Console.WriteLine("Data source {0} created successfully", datasource)

Catch e As Exception

    Console.WriteLine(e.Message)

End Try
Run Code Online (Sandbox Code Playgroud)

您尚未指定您正在使用的Reporting Services版本,因此我假设为2008.请注意,根据SQL Server版本,可以使用多个端点.2005/2008终点在2008R2及以上版本中被弃用,但仍可使用.在编写脚本时要记住一些事情.

2.通过应用程序调用SSRS Web服务

报表服务器Web服务概述

从上面的脚本进行的相同调用也可以在任何其他应用程序中进行.因此,您只需要通过WSDL添加对报表服务器Web服务的引用,您就可以连接到远程服务并调用其方法来部署报表,数据源等.

因此,最终您将连接到报表服务器Web服务,它只是您需要考虑的使用媒介.

使用脚本更容易运行,因为它只是从命令行运行程序,但编写自己的部署应用程序肯定会提供更大的灵活性.我建议让脚本运行,以便您了解该过程,然后根据需要将其迁移到定制应用程序.祝好运!


Jer*_*oen 5

您可以使用基于表达式的连接字符串来选择正确的数据库。您可以基于应用程序传入的参数或UserId全局变量。我相信您需要配置无人参与的执行帐户才能正常工作。

注意:请注意安全隐患。意识到如果将敏感数据(例如密码)传递给参数,则(a)它会通过网络传递,并且(b)将存储在执行日志表中以提供报告服务。

  • 回到并阅读自我发布以来的评论,这似乎是迄今为止的最佳人选。似乎您必须从共享数据源转到嵌入式数据源,但是一旦完成,您应该具有所需的灵活性。+1; 我认为这应该是公认的答案。 (2认同)