我正在使用VS2010和内置的可视化报表设计器来创建RDLC模板,以使用ReportViewer控件和.LocalReport成员在ASP.NET应用程序中将子报表作为PDF文件呈现。代码迭代一组记录,为每条记录生成一个报告(及其子报告)。
我最近注意到,对于少量报告,其中一个子报告失败并显示“错误:子报告无法显示”消息。令我困惑的是这个案例,与我读过的关于这个错误的很多帖子(以及我之前曾经和我自己一起讨论过)相比,它只发生在一部分案例中;从我在其他地方看到的情况来看,问题通常是全有或全无 - 这个错误总是出现,直到找到解决方案,然后出现从不的错误。< / p>
那么......什么可能导致只有一部分记录的错误?我可以直接运行有问题的子报告而不会出错;我可以打开.xsd文件并为没有错误的违规记录预览DataSet;我可以在SQL Server Mgt Studio中运行DataSet后面的查询而不会出现错误...我不知道还有什么地方可以找到这个问题的原因,这个问题只有在我运行带子报告的报告时才出现? / p>
答案 0 :(得分:1)
我将其跟踪到一个过时的.xsd文件(DataSet) - 在表格列字符串宽度增加的某处,但DataSet未更新或重新生成,因此它仍然具有旧的宽度对该元素的限制,例如,&lt; xs:maxLength value =“50”/&gt;在.xsd XML中,而不是125个字符的新宽度。对于那些子报表中至少有一条记录在该列中的数据值(字符串)超过旧宽度50的情况,会抛出错误。
为DataSet的.Selected事件添加处理程序提供了一个重要线索;我已经在使用.Selecting事件来设置子报告的参数(将其绑定到父记录),但是在打破该事件时我看不到任何有用的东西。但是,检查.Selected事件中的事件args变量,在选择应该发生之后,我发现了一个异常(“调用目标抛出了异常”)和InnerException(“无法启用约束。一个或者更多行包含违反非null,唯一或外键约束的值“)。还有一个堆栈跟踪,表明失败点正在执行Adapter.Fill(dataTable)。
虽然这被误导了 - 我对DataSet背后的查询所涉及的表没有这样的限制 - 它至少让我专注于子报表中的特定记录。在对子报表记录数据SQL Server Mgt Studio中的异常进行了大量无效搜索后,我最终开始从一个有问题的子报表案例中逐个删除记录,每次重新运行报表以查看是否已修复错误。最终我删除了一个子报告记录,报告工作了 - 剩下的子报告记录出现了!
现在我有一份特定的子报告记录,可以更仔细地检查。偶然(希望我可以称之为灵感直觉......),我决定在Web应用程序中编辑该记录,而不是像在SQL Server中那样查看它。其中一个字段标有警报,表示字符串值太长!这对我来说是一个谜:如果字符串值太长,它怎么可能已经保存在数据库中了?!我仔细检查了表中的列定义,发现它比web-app前端试图强制执行的时间要长。然后我意识到该列已经扩展而没有更新应用程序UI,我立即怀疑.xsd文件还没有更新......宾果!
这个故事可能有很多道德,这给我留下了一种熟悉且不受欢迎的感觉,我并没有像我应该那样聪明地做一些事情。一个道德:总是更新(或更好,通常更简单,只是重新构建)你的.xsd DataSet文件,只要你改变一个查询或表,它基于...比记住更容易说。我有一种不安的感觉,必须有一些方法,我没有想到避免构建脆弱的应用程序,其中数据库中定义的列宽也单独编码到UI和/或代码隐藏,以提供用户反馈和/或进行数据验证......欢迎提出如何更有效管理的建议!