【问题标题】:c# rdlc Cannot create a DataReader for dataset "ProjectDS_ObservationImages"c#rdlc无法为数据集“ProjectDS_ObservationImages”创建DataReader
【发布时间】:2013-12-16 19:31:36
【问题描述】:

我在报告中出现以下问题,其数据是在 win-forms .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));

这是导致问题的报告中添加的最后一个数据源。

每个数据源实际上都是一个数据表。所有都是此项目中 DataSet 的成员(或已克隆模式),该数据集用作报表中的唯一 DataSet。传递的 DataTables 的名称和报表中的 Data Sets 的名称,匹配 100%。

所有其他传递给报表的数据工作,与其他6个成功传递相比,这个数据源没有什么特别之处。

处理报告时,输出中未提供任何错误。

什么可能导致 DataReader 失败?

感谢您的任何意见。

更新 ---------------------------------------------- --------------------------

重命名不起作用,手动重建 DataTable 不起作用,创建并包含具有相同数据的新 DataTable 不起作用。

将报表元素复制并粘贴到子报表中,并将子报表包括在主报表上,一切正常,相同的数据构建代码,相同的数据和相同的报表布局。

rdlc 文件会损坏吗?

【问题讨论】:

    标签: c# reporting-services reportviewer rdlc


    【解决方案1】:

    我必须更详细地研究这个问题,我仍然不明白为什么,但我确实有办法解决不需要子报告的问题,并且可以帮助其他人。

    以源代码模式打开报告:右键单击解决方案资源管理器,打开方式,然后打开 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>
    

    解决方法只是将问题&lt;DataSet&gt; 节点剪切并粘贴到DataSets 集合的前面,使其直接出现在&lt;DataSets&gt; 节点之后。

      <DataSets>
         <DataSet Name="ProjectDS_ObservationImages">
         ...
    

    现在报告工作正常,没有错误,并且所有数据都已加载。

    为什么?我会留下这个问题,希望有人能解释一下。

    【讨论】:

    • 感谢 m8。几天来,我一直在为同样的问题苦苦挣扎。我从来没想过要切换数据集的顺序,但在应用您的修复后,它现在可以正常工作了。
    【解决方案2】:

    我在尝试填充嵌套在 SubreportProcessing - 事件的表中的多个 Subreports 的数据源时遇到了同样的问题。

    我通过仅使用一个对象数据源和多个由 LINQ 填充的数据集来修复它 - 通过 BindingSource 而不是 DataTables 查询每个数据集。您可以使用带有 ConnectionString 参数的 DataContext - 构造函数从多个服务器或源中检索数据。

    我必须直接编辑报告 XML 数据源部分,因为向导会自动为每个数据集添加一个数据源。

    【讨论】:

      【解决方案3】:

      遇到了同样的问题。我注意到的是,失败的数据集的&lt;Query&gt; 标记位于用于生成子报告的&lt;Query&gt; 之后,因此看起来处理子报告以某种方式使父报告中已经填充的数据集无效。正如您所说,解决方案是将父报告的所有&lt;Query&gt; 元素放在用于生成子报告的&lt;Query&gt; 元素之前。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-12
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-24
        • 1970-01-01
        相关资源
        最近更新 更多