C# WebForms RDLC报表报错:未提供‘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>
排查建议
严格匹配数据源名称
确认ReportDataSource构造函数传入的"JobCards"与RDLC中<DataSet Name="JobCards">的名称完全一致,注意大小写、空格等细节。清空原有数据源再添加
在添加新数据源前,先清空报表查看器的数据源集合,避免冲突:JobCardsReport_ReportViewer.LocalReport.DataSources.Clear(); JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);强制刷新报表
添加数据源后调用刷新方法,确保数据生效:JobCardsReport_ReportViewer.LocalReport.Refresh();验证DataTable数据与字段匹配
检查dt_JobCardsDataTable的列名Time与RDLC中<Field Name="Time">的DataField完全一致;添加调试代码确认DataTable是否有数据:Debug.WriteLine($"DataTable行数:{dt.Rows.Count}");检查RDLC文件路径
确认ASPX中<LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">的路径正确,RDLC文件存在于指定位置,路径区分大小写。移除RDLC中的数据源配置
手动绑定数据源时,RDLC中配置的<DataSources>节点可能干扰绑定,尝试移除该节点,只保留<DataSets>部分。
内容的提问来源于stack exchange,提问作者Obada

