【问题标题】:Generate SSRS report in memory在内存中生成 SSRS 报告
【发布时间】:2016-12-02 12:24:51
【问题描述】:

我正在研究在内存中生成 SSRS 报告以作为邮件附件附加的解决方案。我用的是2010版。

报表具有必须填写的参数以正确呈现报表。

我找到了一些解决方案如何做到这一点:

解决方案 1

使用 MS 原生 ReportViewer 类。我们可以在内存中实例化对象,连接到服务器并使用控制 API 以所需格式呈现报告

report.ServerReport.ReportServerCredentials = new MyCredentials(...);
report.ServerReport.ReportServerUrl = new Uri("ssrs_url");
report.ServerReport.ReportPath = "path-to-report";

byte[] reportData = report.ServerReport.Render("excel");

该解决方案有一个主要缺点 - 它需要大量依赖项才能使用报告控制。因此,很难在分层架构中使用,因为较低层具有有限且预定义的依赖项集以松散耦合并易于移植到广泛的操作系统和云堆栈。

所以在我的情况下不能采用这种解决方案

解决方案 2

使用报表服务器公共 API 访问已采用所需格式的数据。我发现这是可以实现的,MS 证实了这一点。这是链接https://msdn.microsoft.com/en-us/library/ms154040.aspx

所以我们可以使用正确配置的链接来访问数据:http://myrshost/ReportServer?/myreport&rs:Format=PDF

此解决方案最适合我的需求,但我不知道如何将报表参数传递给此报表?还有如何首先针对 SSRS 报表服务器进行身份验证?

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 是否可以选择使用 ReportingServices Web 服务?根据您的 SSRS 版本(您可以将其包含在您的帖子中),您可以在此处找到服务 asmx:myrshost:80/ReportServer/ReportExecution2005.asmx
  • 是的,我有所有需要的数据。如何将数据传递给特定的报表参数。我要求在提交报告之前填写属性
  • 现在有约会,稍后会回复您(如果没有其他人更快;))同时查看 MSDN 的服务。 msdn.microsoft.com/en-us/library/ms152787.aspx

标签: c# reporting-services reportviewer


【解决方案1】:

所以,终于写出答案了。

首先:遗憾的是,在使用报告的简单 URL 访问时,我找不到任何包含参数的方法。我还没有真正使用它。因此,对于您的具体情况,可能还有另一种(更好的)解决方案。

关于您在第一个解决方案中所述的限制: 我实际上看不到您为此使用了什么“框架”,但如果您无论如何都不能使用它,那就无关紧要了。

我建议您使用 SSRS WebServices,正如我在我的 cmets 中所述。可以在here 找到有关此的基本信息。基本上你只需要做一些简单的步骤:

  1. 使用 WebService(它是一个 SOAP 服务)并让 Visual Studio (.NET) 为您生成代理类。网络上有各种各样的教程。例如this one。我在这里没有看到依赖项有任何问题,因为它只是一个 WebService。

  2. 那么你已经可以调用WebService了。代理为您生成了所有必要的类。

以下示例演示了调用,以及如何将参数传递给 WebService(当然,这很容易实现)。请注意,该示例是为 ReportExecution2005.asmx 编写的。最新版本可能存在差异。

var client = new ReportExecutionService();
client.Url = "UrlToReportExecutionASMXonYourServer";
client.Credentials = yourCredentials // (is of type System.Net.ICredentials)

client.LoadReport2("RelativePathToYourReportOnServer", null);

var parameters = new ParameterValue[amountOfYourParameters];
parameters[0] = new ParameterValue() { Name = "ParamNameInReport", Value = "Value" };
client.SetExecutionParameters(parameters, CultureInfo.CurrentCulture.Name.ToLowerInvariant());

string encoding, mimeType, extension, deviceInfo;
Warning[] warnings;
string[] streamIDs;
var result = client.Render("ExportFormatOfDesiredResult", deviceInfo,  out extension, out encoding, out mimeType, out warnings, out streamIDs);

“ExportFormatOfDesiredResult”可以替换为“Xml”、“Pdf”、“Word”等。 一世 然后,您的结果将是一个字节流,您可以将其返回给您的客户端、附加到邮件或任何您想做的事情。

我希望这对你有帮助。如果出于任何原因这不适合您的需求,请随时寻求进一步的帮助或让我知道。 (请添加您的架构的详细描述以及它的限制,因为我目前不明白您到底需要什么以及您不能做什么。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多