我在报告中出现了以下问题,其数据是在win-form .net 4应用程序中使用C#动态加载的。
无法为数据集“projectDS_ObservationImages”
创建DataReader
使用数据加载报告的来源:
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_Site", this._dsProjectData.Tables["Site"]));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_Client", this._dsProjectData.Tables["Client"]));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_Head", this.getRangedHeadersCopy(this._htExcludeHeaders)));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_Obs", this.getRangedObservationsCopy(this._htExcludeObservations)));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_Images", dtProjectImages));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_PMPL", this._dtPerMeterPerLineHeaders));
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ProjectDS_ObservationImages", this._dtObervsationImages));
这是添加到报告中的最后一个导致问题的数据源。
每个DataSource实际上都是DataTable。所有这些都是此项目中DataSet的成员(或克隆了模式),该模式在报告中用作唯一的DataSet。传递的DataTables的名称和报告中数据集的名称匹配100%。
传递给报告的所有其他数据都有效,这个数据源没有什么特别的,而其他6个成功通过了。
处理报告时输出中没有错误。
什么可能导致DataReader失败?
感谢您的任何意见。
更新---------------------------------------------- --------------------------
重命名不起作用,手动重建DataTable不起作用,创建并包含具有相同数据的新DataTable不起作用。
将报表元素复制并粘贴到子报表中,并在主报表上包含子报表,一切正常,相同的数据构建代码,相同的数据和相同的报表布局。
rdlc文件可能已损坏吗?
答案 0 :(得分:2)
我必须更详细地研究这个问题,我仍然不明白为什么,但我确实有办法解决不需要子报告的问题,并可能帮助其他人。
以源模式打开报告:右键单击解决方案资源管理器,打开,然后打开XML编辑器。
在rdlc源代码中,您将看到一个元素<DataSets>
,它是报表定义的数据集的父级,每个都表示为<DataSet>
节点。
在我的情况下,导致无法创建数据读取器错误的原因是最后一次。
无法为数据集“projectDS_ObservationImages”
创建数据读取器
<DataSets>
<DataSet Name="ProjectDS_Head">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>Headers</rd:TableName>
<rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
<rd:TableAdapterName>HeadersTableAdapter</rd:TableAdapterName>
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_Obs">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>Observations</rd:TableName>
<rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
<rd:TableAdapterName>ObservationsTableAdapter</rd:TableAdapterName>
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_Client">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>Client</rd:TableName>
<rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
<rd:TableAdapterName>ClientTableAdapter</rd:TableAdapterName>
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_Site">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>Site</rd:TableName>
<rd:TableAdapterFillMethod>Fill</rd:TableAdapterFillMethod>
<rd:TableAdapterGetDataMethod>GetData</rd:TableAdapterGetDataMethod>
<rd:TableAdapterName>SiteTableAdapter</rd:TableAdapterName>
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_Images">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>ProjectImages</rd:TableName>
<rd:TableAdapterFillMethod />
<rd:TableAdapterGetDataMethod />
<rd:TableAdapterName />
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_PMPL">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>PerMeterPerLine</rd:TableName>
<rd:TableAdapterFillMethod />
<rd:TableAdapterGetDataMethod />
<rd:TableAdapterName />
</rd:DataSetInfo>
</DataSet>
<DataSet Name="ProjectDS_ObservationImages">
<Query>
<DataSourceName>ProjectDS</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
...
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>ProjectDS</rd:DataSetName>
<rd:SchemaPath>C:\...\ProjectDS.xsd</rd:SchemaPath>
<rd:TableName>ObservationImagesEx</rd:TableName>
<rd:TableAdapterFillMethod />
<rd:TableAdapterGetDataMethod />
<rd:TableAdapterName />
</rd:DataSetInfo>
</DataSet>
</DataSets>
修复只是将问题<DataSet>
节点剪切并粘贴到DataSet集合的前面,以便它直接显示在<DataSets>
节点之后。
<DataSets>
<DataSet Name="ProjectDS_ObservationImages">
...
现在报告工作正常,没有错误,并且所有数据都已加载。
为什么呢?我会打开这个问题,希望有人可以解释。
答案 1 :(得分:2)
我在尝试填充嵌套在SubreportProcessing - Event中的表中的几个Subreports的DataSource时遇到了同样的问题。
我通过使用一个Object DataSource来修复它,其中多个DataSets由LINQ填充 - 每个通过BindingSource而不是DataTables查询。您可以使用DataContext - 带有ConnectionString参数的构造函数来检索来自多个服务器或源的数据。
我必须直接编辑Reports XML DataSource Sections,因为向导会自动为每个DataSet添加一个DataSource。
答案 2 :(得分:2)
有同样的问题。我注意到,失败的数据集的<Query>
标记位于用于生成子报告的<Query>
之后,因此看起来处理子报告会以某种方式使父报告中已填充的数据集无效。正如您所说,解决方案是在用于生成子报告的<Query>
元素之前放置父报告的所有<Query>
元素。