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

本文关键字:报表 SSRS 数据源 方式更 服务器端 编程 | 更新日期: 2023-09-27 17:56:07

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

我们使用的是报表服务器 2008 R2。

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

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

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

这是我们在环境中完成的工作 - 我们维护一组报告,这些报告可以部署在任何具有自己配置的客户端上。

您在这里有几个选择。由于您使用的是共享数据源,因此事情变得更加容易,因为您无需为每个报表定义数据源。

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

rs.exe at Books Online

此程序允许您创建可与报表服务器 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"

因此,这将调用脚本 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

然后可以进行 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

您尚未指定您正在使用的 Reporting Services 版本,因此我假设是 2008 年。请注意,可以使用多个终结点,具体取决于 SQL Server 版本。2005/2008 终点在 2008R2 及更高版本中已弃用,但仍可用。只是编写脚本时要记住的事情。

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

报表服务器 Web 服务概述

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

因此,最终您连接到报表服务器 Web 服务,它只是您需要考虑的所用介质。

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

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

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