c# - 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;我已经确认这不是这里的问题
解决方案
解决方案
这是导致此问题的字段调用,但字段引用是正确的。识别此调用后,修复是完全删除单元格(在我的情况下,删除整行,因为它是该行上使用的唯一单元格)并重新创建它。
故障排除详细信息
我知道怎么做,但不知道为什么。下定决心解决这个问题,我把报告复印了一份,然后慢慢删除部分,直到问题停止。重置,删除包含问题的该部分的子部分,重复。
我最终确定问题出在单个单元格上,并且仅在特定情况下:当 的值=Fields!Level3Name.Value
具有Non-Controllables
. 仅删除表达式将允许呈现报告。将表达式修改为=Fields!Level3Name.Value & " "
或=CStr(Fields!Level3Name.Value)
将允许生成报告,但此字段将显示#Error:
该图像底部的 Total 行引用了完全相同的字段。我尝试了其他一些小的更改,但它们要么导致#Error,要么我不喜欢解决方法,所以最后我尝试插入一个新行,手动重新创建单元格,然后删除旧的。现在一代工作得很好(在测试中,敲木头。)
我最好的猜测是,-
导致渲染器尝试将结果视为方程式。但是不同的参数也会有这个或类似的Field3Name
并且运行没有问题,而且只有当我尝试通过 C#.net 应用程序将报告生成为 PDF 时才会发生这种情况,而其他任何地方都没有。我分析了“固定”TablixMember(代表整行)与“损坏”的 XML,即使在调整为使用完全相同的设置后,固定的设置仍然有效。所以,我不知道为什么会这样,但至少如果它再次发生,我有办法追赶它。
推荐阅读
- python - Windows 路径和 Anaconda 虚拟环境如何协同工作?
- python - Python 应用程序可以在 iOS 设备上运行吗?
- hbase - Hbase 复制问题
- vuejs2 - Vue 和 Bootstrap:如何根据媒体断点显示不同的组件?最新共识是什么?
- r - 使用列名向量对 data.frame 或 data.table 进行排序
- sparql - gremlin 中的一种遍历(模式匹配)
- reactjs - 反应,渲染不同的组件并保持滚动位置
- javascript - 在加载图像作为背景之前有一段时间,js
- python - Python noob:为游戏创建 D&D 风格的角色
- r - 在新 R 版本中编译用旧版本编写的代码时出现问题