【问题标题】:Rendering SSRS report, with no parameters, using ReportViewer control fails使用 ReportViewer 控件呈现不带参数的 SSRS 报告失败
【发布时间】:2017-06-15 18:38:20
【问题描述】:

我正在处理一个 ASP.Net 页面,该页面使用 ReportViewer 控件显示来自远程 SSRS 服务器的报告。在我们部署不需要/接受任何参数的新报告之前,它一直没有问题。呈现这些报表时,报表的第一页会呈现良好,但当您切换到另一个页面(使用 ReportViewer 中的控件)时,您会收到一条错误消息,提示“一个或多个数据源缺少凭据”。

这就是 ReportViewer 的配置方式...

this.Report.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
this.Report.ServerReport.ReportServerUrl = new Uri(App.Config.ReportServerPath);
this.Report.ServerReport.ReportPath = this.ReportPath;
this.SetRerportParameterValues(); // This does nothing since the report doesn't have any parameters
this.Report.AsyncRendering = false;

如果我将 AsyncRendering 更改为 true,则在呈现报告的第一页时会显示错误。

在呈现没有任何参数的报表时,我与参数有什么不同吗?

【问题讨论】:

  • 很好奇,如果您只是从 SSRS 报告生成器运行报告,您是否也会收到错误消息?因此,您的代码并没有真正的问题,只是在开发报告时它使用 Windows auth 并且开发人员可以运行它,但是当您从应用程序运行它时,它没有获取过去访问数据源的凭据?
  • 直接从报表服务器运行报表时运行良好。 Web 应用程序作为服务帐户运行,并且该服务帐户具有必要的权限。我也使用我的帐户(完全访问权限)运行它,但未成功。另外,如果是这种情况,为什么还要呈现第一页?该报告使用共享数据源,其他报告使用相同的数据源正常工作。这个问题似乎只发生在没有任何参数的报告中。我还没有尝试过,但我确定如果我在报告定义中添加了一个无用的参数,它会起作用。
  • 报告在任何地方都运行良好,除非它尝试将其加载到我的自定义 asp.net 包装器页面中。即使那样,第一页也会很好地呈现。只有当我尝试切换到另一个页面时它才会失败。如果我使用其中一个下载链接下载报告,我将获得所有数据。

标签: c# asp.net reporting-services reportviewer


【解决方案1】:

最好去掉

this.SetRerportParameterValues();

因为这似乎无济于事。

而且,您确定此非常 报告中没有任何子报告吗?如果是,您可能需要检查其查询/数据源等。

编辑

有一些known issues with the reportviewer控制。 我个人在设计报表时仅将 reportviewer 作为基本查看器,因为从用户角度来看,由于某些问题,reportViewer 并不是最佳选择。
因此,为了让报表数据输出显示给用户,最好在后面的代码中convert report to PDF on the fly,并将PDF显示给用户。

【讨论】:

  • 我已经删除了 SetReportParameterValues() 函数,进行测试,但我仍然有问题。有问题的报告是非常基本的报告,没有子报告。
  • @nitedmn 尝试运行您在数据源、BIDS 或数据工具查询构建器中的查询,无论您在其中制作报告,看看您是否能够成功运行基础查询,开始,看看出了什么问题..!
  • 查询工作正常,除了自定义 .net 报表包装器(使用 ReportViewer 控件)之外,报表将在任何地方呈现正常。正如我在第一篇文章的评论中提到的,如果我使用下载选项下载报告(任何格式),所有数据都将返回。
  • @nitedmn,如果是这样,那么reportviewer 有一些已知问题,请检查我的编辑。因此,此编辑并不能解决您的问题,但它表明reportViewer 粗略形式不是呈现数据的最佳选择。
【解决方案2】:

我仍然不确定为什么会发生这种情况,但我确实找到了原因并且能够解决它。

我的 ASPX 页面继承自自定义页面库(继承了 System.Web.UI.Page)。基本页面的初始化循环通过页面上的所有 HTML 控件并将一个简单的处理程序附加到更改事件。当控件的值被修改时,事件处理程序只需将控件添加到列表中。这个事件处理程序非常简单,看起来像这样......

 private void HtmlCtrl_ServerChange(object sender, EventArgs e)
    {
        HtmlControl ctrl = sender as HtmlControl;
        if (ctrl != null)
        {
            this.changedControls.Add(ctrl);
        }
    }

由于某种原因,我仍然不确定为什么,当您尝试导航到具有零参数的报表的第二页时,此功能会弄乱 ReportViewer 控件。为了解决这个问题,我只是在我的基页类中添加了一个附加属性,它允许我禁用更改跟踪功能,因为此页面上不需要它。

【讨论】:

    猜你喜欢
    • 2015-01-04
    • 2015-12-30
    • 2013-06-24
    • 2014-07-22
    • 2010-12-16
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多