我正在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。我已经确认这不是问题所在
答案 0 :(得分:0)
是 导致此问题的字段调用,但是字段引用正确。确定此调用后,解决方法是完全删除该单元格(在我的情况下,因为整行是该行上使用的唯一单元格,所以删除了整行)并重新创建它。
我知道怎么做,但不知道为什么。为了解决这个问题,我制作了一份报告副本,并慢慢删除了各个部分,直到问题停止。重置,删除该部分中包含该问题的子部分,重复。
我最终确定问题出在单个单元格中,并且仅在特定情况下:当=Fields!Level3Name.Value
的值为Non-Controllables
时。仅删除表达式将允许报表呈现。将表达式修改为=Fields!Level3Name.Value & " "
或=CStr(Fields!Level3Name.Value)
将允许报表生成,但是该字段将显示 #Error :
该图像底部的“总计”行引用了完全相同的字段。我尝试了其他一些小的更改,但是它们导致了#Error或我不喜欢这种解决方法,因此最后,我尝试仅插入新行,手动重新创建单元格,然后删除旧单元格。现在,世代工作正常(在测试中,敲开木头。)
我的最佳猜测是-
导致渲染器尝试将结果视为方程式。但是不同的参数也将具有此参数或类似的Field3Name
并且可以毫无问题地运行,并且再次出现这种情况仅在我尝试通过C#.net应用程序将报告生成为PDF时发生,而在其他任何地方都不会发生。我分析了“固定” TablixMember(代表整行)与“断”行的XML,即使在调整为使用与固定行完全相同的设置之后,也是如此。所以,我不知道为什么会这样,但至少如果再次发生,我有办法追捕。