65.9K
CodeProject 正在变化。 阅读更多。
Home

以编程方式操作SSRS订阅

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.63/5 (7投票s)

2009 年 4 月 29 日

CPOL

3分钟阅读

viewsIcon

149747

downloadIcon

2858

本文演示了如何在不使用 SSRS 界面ng的情况下,动态处理 SQL Server Reporting Services 订阅。

引言

SQL Server Reporting Services 允许以编程方式处理各种报表订阅。您可以读取特定的订阅并在代码隐藏中按需进行更改。我假设您已经了解 Reporting Services 中的订阅机制。对于不了解的各位,Reporting Services 中的订阅只不过是由您定义和设置的自动化服务(SQL Server 作业),用于在特定时间或特定事件发生时传递报表。您还可以定义报表将以何种格式呈现给用户。现在,您设置的任何订阅属性都将存储在报表服务器数据库中。ScheduleSubscriptionsReportSchedule 表包含所有这些信息。

实现

您可以下载本文提供的代码。在本文中,我将不讨论全部代码,而是更侧重于关键点。

首先,创建一个 Windows 或 Web 应用程序。为 ReportingService2006 添加 Web 引用。如果 SSRS 已安装在您的系统上,您可以在以下 URL 中轻松找到 ReportService2006.asmx

http://servername/_vti_bin/ReportServer/ReportService2006.asmx

请注意,servername 必须替换为实际的报表服务器 URL。如果报表服务器未安装在您的系统上,您可以使用上述 URL(必须替换服务器名称)在远程报表服务器上找到此 Web 服务。

ActiveState active = null;
ParameterValueOrFieldReference[] extensionParams = null;
ExtensionSettings extSettings = null;
ParameterValue[] values; a
string desc = string.Empty;
string eventType = string.Empty;
string matchData = string.Empty;

通过传递需要更改的订阅的订阅 ID 来调用 ReportingService2006 Web 服务的 GetSubscriptionProperties 方法

ReportingService2006 rs = new ReportingService2006();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
rs.GetSubscriptionProperties(txtSubscriptionID.Text.Trim(), out extSettings, 
   out desc, out active, out status, out eventType, out matchData, out values);   

此方法的不同参数详情如下:

  • 订阅 ID:需要修改的订阅的唯一 ID。
  • 扩展设置:报表传递扩展及其可配置的设置。这是一个输出参数。
  • 描述:包含一些有意义的描述,将显示给用户。这是一个输出参数。
  • ActiveState:返回指定订阅的 ActiveState。这是一个输出参数。
  • Status:订阅的状态,是一个输出参数。
  • EventType:返回触发订阅的事件类型。这是一个输出参数。
  • MatchData:返回特定于报表执行和传递调度过程的 XML 数据。这是一个输出参数。
  • ParameterValue[]:报表不同参数的集合。这也是一个输出参数。

要获取 Web 服务返回的所有扩展设置,您可以使用以下代码

ParameterValueOrFieldReference[] extensionParams = extSettings.ParameterValues;
foreach (ParameterValueOrFieldReference extensionParam in extensionParams)
{
    if (((ParameterValue)extensionParam).Name.Equals("TO"))
    {
        txt_TO.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("CC"))
    {
        txt_CC.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("BCC"))
    {
        txt_BCC.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("ReplyTo"))
    {
        txt_ReplyTo.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("Subject"))
    {
        txt_Sub.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("Comment"))
    {
        txt_Comment.Text = ((ParameterValue)extensionParam).Value;
    }
    if (((ParameterValue)extensionParam).Name.Equals("Priority"))
    {
        txt_Priority.Text = ((ParameterValue)extensionParam).Value;
    }
}

正如我之前所写,matchdata 参数返回 XML 字符串,需要先解析才能更改或修改。您始终可以在报表服务器数据库的 Subscription 表中执行 select 语句来查看 matchdata 列的样子。但前提是,您必须先创建一个报表订阅。理解不同调度期间的匹配数据的 XML 定义,然后根据您的要求解析并绑定到不同的控件。

在检索了 ReportingService2006 的所有信息并进行绑定后,就轮到您根据要求更改数据了。现在,要保存订阅,请注意,您需要再次创建一个 XML 字符串,其中包含修改后的报表调度定义。最后,调用 ReportingService2006 Web 服务的 SetSubscriptionProperties 方法。

rs.SetSubscriptionProperties(subscriptionID, extSettings, desc, 
                             eventType, xmlScheduling, values);

这将更新报表服务器数据库中的订阅定义。需要特别注意的是,动态生成的 matchdata 必须与确切的定义一致。有五种类型的调度期间:一次性、每小时、每日、每小时、每周和每月。对于每种不同的调度期间,XML 架构或多或少都不同。因此,我建议您不要在不了解不同调度期间的 matchdata 格式的情况下使用 SetSubscriptionProperties 方法来更改订阅。否则,报表订阅可能会因不正确的 matchdata 而损坏。

附注与参考

以下链接在实施过程中可能非常有用:http://technet.microsoft.com/en-us/library/reportservice2006.reportingservice2006_members.aspx

您可以访问我的技术博客:http://tech-motive.blogspot.com

© . All rights reserved.