C# WebForms RDLC 报告 |没有为数据集提供数据源实例

问题描述 投票:0回答:1

我正在创建一个 C# 报告解决方案,其中包含多个 RDLC 报告以及每个 RDLC 文件后面的 ASPX 视图页面,并且这些报告使用本地数据集 (.xsd) 中的数据提供数据。数据集包含从 SQL 存储过程和数据表检索数据的表适配器。有些报表需要动态获取数据,并使用DataTable对象作为数据源与RDLC文件绑定。我正在按照以下步骤操作

1-在xsd数据集中创建DataTable对象
2-将数据集添加到RDLC报告中,类型为xsd数据集中创建的DataTable。
3- 在代码隐藏 ASPX 文件中,检索 IEnumerable 对象中的数据
4- 创建在(1)中创建的DataTable类的实例,并向该实例添加行 来自 IEnumerable
5- 使用 RDLC 报告中指定的数据集名称从 DataTable 对象创建 ReportDataSource 对象
6- 将 ReportDataSource 对象添加到报表查看器的 DataSource 集合中。

.xsd 数据集名称:WoqodEPIDataSet.xsd
RDLC 名称:JobCardsReport.rdlc

尽管如此,我仍然收到错误“尚未为数据源‘JobCards’提供数据源实例。”

RDLC 源代码(DataSource 和 DataSet 部分)

<?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>

我之前有一份类似的报告,但在比较它们之后我找不到任何差异,并且我遵循完全相同的步骤。我看不出这里有什么问题

注意:为了简单起见,DataTable 仅具有一个字符串列,并且它提供简单的静态数据

c# .net webforms rdlc
1个回答
0
投票

您得到的错误

"A data source instance has not been supplied for the data source 'JobCards'."
具有误导性。 RDLC 源代码不是必需的。就你而言,它看起来很好。我之前看到和遇到的问题与文件的路径有关。它不适用于此类相对路径。我建议的修复是删除:

 <LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">
 </LocalReport>

从 ASPX 文件中将其添加到后面的代码中:

JobCardsReport_ReportViewer.LocalReport.ReportPath = Server.MapPath("~/ReportViews/JobCardsReport.rdlc");

ReportDataSource rds = new ReportDataSource("JobCards", (DataTable)dt);
                JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);

请在调试器中检查构造的

ReportPath
是磁盘中的文件位置。

© www.soinside.com 2019 - 2024. All rights reserved.