首页 > 解决方案 > SSRS 渲染在深奥的上下文中失败

问题描述

我在 C#.net 应用程序中使用 ReportingService2005,该应用程序连接到 SSRS 服务器以生成多个 PDF 报告并将它们组合成一个 PDF。它对于一个粗略的内部程序运行良好,但我最近部署了旧报告的更新版本,以便在某些参数上更加灵活。这些报告是通过从旧版本复制表格以保持格式,然后更新表达式以匹配新报告设置来制作的。这些报告之一,只有在我遇到时可以重复的非常特定的上下文中(但无法确定触发它的原因),将无法在程序中呈现:

System.Web.Services.Protocols.SoapException - An error occurred during rendering of the report. --->
Microsoft.ReportingServices.ReportProcessing.UnhandledReportRenderingException: An error occurred during rendering of the report. ---> 
Microsoft.ReportingServices.OnDemandReportRendering.ReportRenderingException: An error occurred during rendering of the report. ---> 
Microsoft.ReportingServices.ReportProcessing.ReportProcessingException_NonExistingFieldReference: The expression referenced a non-existing field in the fields collection.

(添加换行符以帮助阅读。)即使我尝试在调试中分析 SoapException,它也没有说明正在引用哪个字段或哪个元素失败。如果我查看 SSRS 服务器上的相关转储日志,报告是:

library!ReportServer_0-113!248!03/21/2019-18:53:16:: e ERROR: Report server unique dump occured. Exception: Microsoft.ReportingServices.ReportProcessing.UnhandledReportRenderingException: An error occurred during rendering of the report. ---> Microsoft.ReportingServices.OnDemandReportRendering.ReportRenderingException: An error occurred during rendering of the report. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException_NonExistingFieldReference: The expression referenced a non-existing field in the fields collection.
   at Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.FieldsImpl.CheckedGetFieldByIndex(Int32 index)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateSimpleFieldReference(Int32 fieldIndex, VariantResult& result)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateSimpleExpression(ExpressionInfo expression, VariantResult& result)
   at Microsoft.ReportingServices.RdlExpressions.ReportRuntime.EvaluateTextRunValueExpression(TextRun textRun)
   at Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.TextRunImpl.GetResult(IReportScopeInstance romInstance)
   at Microsoft.ReportingServices.OnDemandReportRendering.InternalTextRunInstance.EvaluateOriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.InternalTextRunInstance.get_OriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.TextBoxInstance.EvaluateOriginalValue()
   at Microsoft.ReportingServices.OnDemandReportRendering.TextBoxInstance.get_TypeCode()
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox.GetAlignmentRight(Style style, StyleInstance styleInstance)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox.InitParagraphs()
   at Microsoft.ReportingServices.Rendering.HPBProcessing.TextBox..ctor(TextBox source, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.PageItem.Create(ReportItem source, Boolean tablixCellParent, Boolean ignoreKT, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.AddRowMember(TablixMember rowMember, Int32 colIndex, Int32 rowSpan, Int32 colSpan, LevelInfo childInfo, PageContext pageContext, Double updateWidth)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateRowMemberChildren(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Boolean parentBorderHeader, Int32 parentRowIndex, Int32 parentColIndex, Int32 sourceIndex, Boolean resetContext, Boolean parentHasFooters, LevelInfo parentLevelInfo, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateDynamicRowMemberChildren(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Int32 sourceIndex, Int32 parentRowIndex, Int32 parentColIndex, Boolean parentHasFooters, LevelInfo parentLevelInfo, PageContext pageContext)
   at Microsoft.ReportingServices.Rendering.HPBProcessing.Tablix.CreateTablixRows(Tablix tablix, TablixMember rowMemberParent, Int32 defTreeLevel, Boolean parentBord, Message: , Unhandled Exception: False

除了在尝试呈现单元格时发生错误(这没有帮助,有页眉、页脚和单个 tablix)之外,这似乎不再告诉我了。

同样的报告,对于相同的参数,将在 Visual Studio、ReportViewer 中通过我们的网站、SSRS Web 界面正常工作,即使我在这个自定义程序中将文件呈现为 Excel 而不是 PDF。(通过其他接口生成 PDF 也可以正常工作。)我已经梳理了报告的代码中的错误Field!语句,特别是在指定上下文的情况下(例如另一个 DataSet)并没有发现任何问题。

我知道 ReportingServices 可以发出极其深奥的错误消息[1],因此这很可能与不存在的字段完全无关,但我无法弄清楚报告或方式可能有什么问题我打电话来生成它。如果我使用一组稍微不同的参数,参考日期范围而不是预定义的时间范围来获取相同的数据,它会生成正常;在这种情况下,有一个列没有填写,使其成为潜在的罪魁祸首,但我再次找不到任何错误。

是我遗漏了什么,还是我误解了错误消息?还有其他地方可以真正告诉我哪个水力压裂单元有错误吗?报告问题的最后解决方案是从头开始完全重新创建它们,但我想避免这种情况,因为报告很复杂,有很多微小的细节。

另外,我注意到GetAlignmentRight跟踪的中途;这可能有助于调试吗?如果渲染调用右/中/左,我可以非常痛苦地缩小有问题的单元格,如果有的话。但是,我尝试将所有右对齐的单元格更改为居中,并且跟踪没有改变。编辑:不,导致问题的单元格是居中对齐的,所以在这种情况下这不会有帮助。


[1] 我在另一份报告中处理的另一条错误消息说,当实际问题由于渲染时间过长而超时时,引用了不存在的 ReportItem;我已经确认这不是这里的问题

标签: c#reporting-servicesssrs-2016

解决方案


解决方案

导致此问题的字段调用,但字段引用是正确的。识别此调用后,修复是完全删除单元格(在我的情况下,删除整行,因为它是该行上使用的唯一单元格)并重新创建它。


故障排除详细信息

我知道怎么做,但不知道为什么。下定决心解决这个问题,我把报告复印了一份,然后慢慢删除部分,直到问题停止。重置,删除包含问题的该部分的子部分,重复。

我最终确定问题出在单个单元格上,并且仅在特定情况下:当 的值=Fields!Level3Name.Value具有Non-Controllables. 仅删除表达式将允许呈现报告。将表达式修改为=Fields!Level3Name.Value & " "=CStr(Fields!Level3Name.Value)将允许生成报告,此字段将显示#Error

错误示例

该图像底部的 Total 行引用了完全相同的字段。我尝试了其他一些小的更改,但它们要么导致#Error,要么我不喜欢解决方法,所以最后我尝试插入一个新行,手动重新创建单元格,然后删除旧的。现在一代工作得很好(在测试中,敲木头。)

我最好的猜测是,-导致渲染器尝试将结果视为方程式。但是不同的参数也会有这个或类似的Field3Name并且运行没有问题,而且只有当我尝试通过 C#.net 应用程序将报告生成为 PDF 时才会发生这种情况,而其他任何地方都没有。我分析了“固定”TablixMember(代表整行)与“损坏”的 XML,即使在调整为使用完全相同的设置后,固定的设置仍然有效。所以,我不知道为什么会这样,但至少如果它再次发生,我有办法追赶它。


推荐阅读