在神秘的环境中SSRS渲染失败

时间:2019-03-22 02:46:08

标签: c# reporting-services ssrs-2016

我正在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)。

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

我知道ReportingServices会产生极其深奥的错误消息[1],因此很可能这与根本不存在的字段无关,但是我无法弄清楚报告或用我调用的方式生成它。如果我使用一组稍有不同的参数(引用日期范围而不是预定义的时间范围)来获取相同的数据,则它会很好;在这种情况下,有一个没有填写的列,使其成为潜在的罪魁祸首,但是我仍然找不到任何错误。

是否缺少某些内容,或者我误解了错误消息?还有另一个地方可以真正告诉我哪个frackin单元有错误吗?解决报告问题的最后办法是完全从头开始完全重建它们,但是我想避免这种情况,因为报告非常复杂,并且包含大量的小细节。

此外,我注意到GetAlignmentRight在跟踪过程的一半。这可能有助于调试吗?如果渲染调用向右/向中心/向左调用,那么即使有一个单元格,我也可以非常痛苦地缩小单元格的范围。但是,我尝试将所有右对齐的单元格都更改为居中,并且迹线也没有更改。编辑:否,导致问题的单元格是居中对齐的,因此这对这种情况。


[1]我在另一份报告中处理的另一条错误消息称,由于渲染时间太长而导致实际问题超时,因此引用了一个不存在的ReportItem。我已经确认这不是问题所在

1 个答案:

答案 0 :(得分:0)

解决方案

导致此问题的字段调用,但是字段引用正确。确定此调用后,解决方法是完全删除该单元格(在我的情况下,因为整行是该行上使用的唯一单元格,所以删除了整行)并重新创建它。


故障排除详细信息

我知道怎么做,但不知道为什么。为了解决这个问题,我制作了一份报告副本,并慢慢删除了各个部分,直到问题停止。重置,删除该部分中包含该问题的子部分,重复。

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

Error Example

该图像底部的“总计”行引用了完全相同的字段。我尝试了其他一些小的更改,但是它们导致了#Error或我不喜欢这种解决方法,因此最后,我尝试仅插入新行,手动重新创建单元格,然后删除旧单元格。现在,世代工作正常(在测试中,敲开木头。)

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