C# 在内存中生成SSRS报告

C# 在内存中生成SSRS报告,c#,reporting-services,reportviewer,C#,Reporting Services,Reportviewer,我正在研究在内存中生成SSRS报告以作为邮件附件附加的解决方案。我用的是2010版 报表具有必需的参数,为使报表正确,应填写这些参数 我发现很少有解决方法可以做到这一点: 解决方案1 使用MS nativeReportViewerclass。我们可以在内存中实例化对象,连接到服务器,并使用控制API以所需格式呈现报告 report.ServerReport.ReportServerCredentials = new MyCredentials(...); report.ServerReport.

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

报表具有必需的参数,为使报表正确,应填写这些参数

我发现很少有解决方法可以做到这一点:

解决方案1

使用MS native
ReportViewer
class。我们可以在内存中实例化对象,连接到服务器,并使用控制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证实了这一点。这里是链接

因此,我们只需使用正确配置的链接即可访问数据:

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


有人能帮我吗?

所以,我终于写了一个答案

首先:遗憾的是,在使用报表的简单URL访问时,我找不到任何包含参数的方法。我还没有真的与之合作过。因此,对于您的具体案例,可能还有另一个(更好的)解决方案

关于您在第一个解决方案中所述的限制: 我实际上不知道你在用什么“框架”,但如果你不能用它,那就无关紧要了

我建议您使用SSRS Web服务,正如我在评论中所说的那样。有关这方面的基本信息可以找到。基本上,您只需执行一些简单的步骤:

  • 使用WebService(它是SOAP服务)并让Visual Studio(.NET)为您生成代理类。网络上有很多关于这方面的教程。例如我在这里看不到依赖项有任何问题,因为它只是一个Web服务

  • 那么您已经可以调用Web服务了。代理为您生成了所有必需的类

  • 下面的示例演示了调用,以及如何将参数传递给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”等。 我 然后,您的结果将是一个字节流,您可以将其返回到您的客户机、附加到邮件或任何您想用它做的事情


    我希望这对你有帮助。如果出于任何原因,这不适合您的需要,请随时寻求进一步的帮助或让我知道。(请详细描述一下您的体系结构及其限制,因为我目前不清楚您需要什么以及您不能做什么。)

    因此,我最终决定写一个答案

    首先:遗憾的是,在使用报表的简单URL访问时,我找不到任何包含参数的方法。我还没有真的与之合作过。因此,对于您的具体案例,可能还有另一个(更好的)解决方案

    关于您在第一个解决方案中所述的限制: 我实际上不知道你在用什么“框架”,但如果你不能用它,那就无关紧要了

    我建议您使用SSRS Web服务,正如我在评论中所说的那样。有关这方面的基本信息可以找到。基本上,您只需执行一些简单的步骤:

  • 使用WebService(它是SOAP服务)并让Visual Studio(.NET)为您生成代理类。网络上有很多关于这方面的教程。例如我在这里看不到依赖项有任何问题,因为它只是一个Web服务

  • 那么您已经可以调用Web服务了。代理为您生成了所有必需的类

  • 下面的示例演示了调用,以及如何将参数传递给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”等。 我 然后,您的结果将是一个字节流,您可以将其返回到您的客户机、附加到邮件或任何您想用它做的事情


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

    使用ReportingServices Web服务是一种选择吗?根据您的SSRS版本(您可以将其包含在帖子中),您可以在此处找到服务asmx:。是的,我有所需的所有数据。如何将数据传递给特定的报表参数。我已经要求在渲染报告之前填写属性。现在有一个约会,稍后将返回给您(如果没有其他人更快;))同时查看MSDN以获取服务。使用ReportingServices Web服务是一种选择吗?根据您的SSRS版本(您可以将其包含在帖子中),您可以在此处找到服务asmx:。是的,我有所需的所有数据。如何将数据传递给特定的报表参数。我已经要求在渲染报告之前填写属性。现在有一个约会,稍后将返回给您(如果没有其他人更快;))同时查看MSDN以获取服务。