You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WebForms RDLC报表报错:未提供‘JobCards’数据集的数据源实例

RDLC报表报错:“A data source instance has not been supplied for the data source 'JobCards'.”

我正在开发一个包含多个RDLC报表的C#报表解决方案,每个RDLC对应一个ASPX视图页面,报表数据来自本地数据集WoqodEPIDataSet.xsd(包含表适配器与DataTable)。部分报表需要动态获取数据,我按以下步骤操作:

  • 在xsd数据集中创建DataTable对象
  • 为JobCardsReport.rdlc报表添加类型匹配的数据集
  • 在ASPX后台以IEnumerable获取数据
  • 创建对应DataTable实例并添加数据行
  • 以RDLC中指定的数据集名称创建ReportDataSource
  • 将数据源添加到报表查看器的数据源集合

但运行时仍收到错误:

A data source instance has not been supplied for the data source 'JobCards'.


相关代码

RDLC源代码(数据源和数据集部分)

<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
  <AutoRefresh>0</AutoRefresh>
  <DataSources>
    <DataSource Name="WoqodEPIDataSet">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSet</DataProvider>
        <ConnectString>/* Local Connection */</ConnectString>
      </ConnectionProperties>
      <rd:DataSourceID>e747194e-5f0b-4c76-8a8c-1739db95ceef</rd:DataSourceID>
    </DataSource>
  </DataSources>
  <DataSets>
    <DataSet Name="JobCards">
      <Query>
        <DataSourceName>WoqodEPIDataSet</DataSourceName>
        <CommandText>/* Local Query */</CommandText>
      </Query>
      <Fields>
        <Field Name="Time">
          <DataField>Time</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
      </Fields>
      <rd:DataSetInfo>
        <rd:DataSetName>WoqodEPIDataSet</rd:DataSetName>
        <rd:SchemaPath>C:\Users\OBA021\source\repos\APCReports\APCReports\WoqodEPIDataSet.xsd</rd:SchemaPath>
        <rd:TableName>dt_JobCards</rd:TableName>
        <rd:TableAdapterFillMethod />
        <rd:TableAdapterGetDataMethod />
        <rd:TableAdapterName />
      </rd:DataSetInfo>
    </DataSet>
  </DataSets>

ASPX后台代码

public partial class JobCardsReport : System.Web.Mvc.ViewPage {
    protected async Task Page_Load(object sender, EventArgs e) {
        if (!IsPostBack) {

            //retrieve station data
            StationDataModel station = StationDataProcessor.RetrieveStationData();
            Session["StationNo"] = station.StationNo;
            Session["StationName"] = station.StationName;

            //assign report parameters
            var repParams = new ReportParameter[9];
            repParams[0] = new ReportParameter("StationNo", Session["StationNo"].ToString());
            repParams[1] = new ReportParameter("StationName", Session["StationName"].ToString());
            repParams[2] = new ReportParameter("DateTo", Session["DateTo"].ToString());
            repParams[3] = new ReportParameter("DateFrom", Session["DateFrom"].ToString());
            repParams[4] = new ReportParameter("OpenedBy", Session["OpenedBy"].ToString());
            repParams[5] = new ReportParameter("AssignedOperator", Session["AssignedOperator"].ToString());
            repParams[6] = new ReportParameter("Status", Session["Status"].ToString());
            repParams[7] = new ReportParameter("ReceiptNumber", Session["ReceiptNumber"].ToString());
            repParams[8] = new ReportParameter("BusinessUnit", Session["BusinessUnit"].ToString());
            this.JobCardsReport_ReportViewer.LocalReport.SetParameters(repParams);

            dt_JobCardsDataTable dt = new dt_JobCardsDataTable();
            dt.Adddt_JobCardsRow("2024-01-02");
            ReportDataSource rds = new ReportDataSource("JobCards", (DataTable)dt);
            JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);
        }
    }
}

ASPX视图页面文件

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JobCardsReport.aspx.cs" Inherits="APCReports.ReportsView.JobCardsReport" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>Job Cards Report</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
            
            <!-- ReportViewer control -->
            <rsweb:ReportViewer ID="JobCardsReport_ReportViewer" runat="server" AsyncRendering="False" Width="100%" Height="500px">
                <LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">
               </LocalReport>
            </rsweb:ReportViewer>
        </div>
    </form>
</body>
</html>

排查建议

  1. 严格匹配数据源名称
    确认ReportDataSource构造函数传入的"JobCards"与RDLC中<DataSet Name="JobCards">的名称完全一致,注意大小写、空格等细节。

  2. 清空原有数据源再添加
    在添加新数据源前,先清空报表查看器的数据源集合,避免冲突:

    JobCardsReport_ReportViewer.LocalReport.DataSources.Clear();
    JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);
    
  3. 强制刷新报表
    添加数据源后调用刷新方法,确保数据生效:

    JobCardsReport_ReportViewer.LocalReport.Refresh();
    
  4. 验证DataTable数据与字段匹配
    检查dt_JobCardsDataTable的列名Time与RDLC中<Field Name="Time">的DataField完全一致;添加调试代码确认DataTable是否有数据:

    Debug.WriteLine($"DataTable行数:{dt.Rows.Count}");
    
  5. 检查RDLC文件路径
    确认ASPX中<LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">的路径正确,RDLC文件存在于指定位置,路径区分大小写。

  6. 移除RDLC中的数据源配置
    手动绑定数据源时,RDLC中配置的<DataSources>节点可能干扰绑定,尝试移除该节点,只保留<DataSets>部分。

内容的提问来源于stack exchange,提问作者Obada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:00:45