asp.net 我在RDLC报告中收到“尚未指定报告”xxxx.rdlc“的报告定义”

li9yvcax  于 2023-02-10  发布在  .NET
关注(0)|答案(6)|浏览(159)

我创建了一个rdlc报表。我的表单上有一个reportViewer。当我尝试加载报表时,我得到:“尚未指定报告'xxxx.rdlc'的报告定义”。我无法解决这个问题。我有一个包含报告所需数据的数据表。我将此dataTable加载回数据库中名为“FinalReport”的表。(我之所以这样做,是因为该rdlc需要某种类型的dataSource。)我的报告中有一个表(table1)。这是我的代码(在报表查看器所在的窗体内):

this.finalDataReportTableAdapter.Fill(this.nehasitDataSet.FinalDataReport);
localReport.ReportEmbeddedResource = @"Resources\VisibleAssets.rdlc";
//I'm not so sure about the following line, but it's the only line that prevented me from getting an error ("no reportdefinition defined"
using (StreamReader rdlcSR = new StreamReader(@"Resources\VisibleAssets.rdlc"))
{
    localReport.LoadReportDefinition(rdlcSR);

    localReport.Refresh();
}

this.reportViewer.RefreshReport();

我还将报表连接到dataTable,将reportViewer连接到报表,我真的看不出问题所在,我在Google上搜索了一下。
任何帮助都将不胜感激。

anauzrmj

anauzrmj1#

导致此问题的原因有多种,有时仅在将同一应用程序发布到IIS时才会出现此问题。如果相关位置中存在报告文件(*.rdlc),但问题仍然存在,您可以尝试以下方法来解决此问题:

  • 来自 * LocalReport.ReportEmbeddedResource Property on MSDN
  • "...嵌入式报表资源是指已作为资源存储在调用程序集中的报表定义。如果已设置ReportPath属性,则将忽略ReportEmbeddedResource属性。这还会导致忽略使用LoadReportDefinition加载的报表。"*
  • 更改日期:*
reportViewer.LocalReport.ReportPath = Server.MapPath("~/Reporting/YourReportName.rdlc");
  • 收件人:*
rw.LocalReport.ReportEmbeddedResource = "YourFullNamespace.Reporting.YourReportName.rdlc";

然后将Build Action属性从YourReportName.rdlc文件的属性更改为Embedded Resource

xtupzzrd

xtupzzrd2#

我得到了相同的错误,但我以不同的方式加载我的报告。我遵循了MSDN上的说明。除了他们引用ReportEmbeddedResource的地方,我使用了ReportPath。当我进行更改时,我的报告加载。

public partial class ReportViewer : Page
{
    private bool _isReportViewerLoaded;

    public ReportViewer()
    {
        InitializeComponent();
        _reportViewer.Load += _reportViewer_Load;
    }

    void _reportViewer_Load(object sender, EventArgs e)
    {
        if (!_isReportViewerLoaded)
        {
            Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = new Microsoft.Reporting.WinForms.ReportDataSource();
            BossbergDataset dataset = DataAccessConstants.myDataset;

            dataset.BeginInit();

            reportDataSource1.Name = "DataSet1"; //Name of the report dataset in our .RDLC file
            reportDataSource1.Value = dataset.Table1;
            this._reportViewer.LocalReport.DataSources.Add(reportDataSource1);
         //My testReport.Rdlc has the [Copy to Output Directory] set to [Copy Always]
            this._reportViewer.LocalReport.ReportPath = @"Reports/TestReport.rdlc";

            dataset.EndInit();

            DataAccessConstants.Table1Adapter.Fill(dataset.Table1);

            _reportViewer.RefreshReport();

            _isReportViewerLoaded = true;
        }
    }
}

我的XAML

<Page x:Class="MyProject.Views.ReportViewer"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xm![enter image description here][2]lns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"
    Title="ReportViewer">

    <Grid>
        <WindowsFormsHost>
            <rv:ReportViewer x:Name="_reportViewer"/>
        </WindowsFormsHost>
    </Grid>
</Page>

还有:

  • 确保将报表文件复制到输出目录。如果使用类似../../Myreport.rdlc的语法,则可能不会复制到输出目录。

  • 确保引用的是正确版本的ReportViewer dll。当我转到"引用"〉"添加引用..."〉"程序集"〉"扩展"并找到报表查看器dll时,它是旧版本。我需要显式导航到

C:\Program Files (x86)\Microsoft Visual Studio 12.0\ReportViewer\Microsoft.ReportViewer.WinForms.dll
查找最新的。如果你弄错了,你会得到一个错误
报表定义无效。详细信息:报表定义的目标命名空间"http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition"无效,无法升级。

gwbalxhn

gwbalxhn3#

在何处将localReport与reportViewer关联?而不是:

using (StreamReader rdlcSR = new StreamReader(@"Resources\VisibleAssets.rdlc"))
  {
      localReport.LoadReportDefinition(rdlcSR);

      localReport.Refresh();
  }

我使用了:

using (StreamReader rdlcSR = new StreamReader(@"Resources\VisibleAssets.rdlc"))
  {
      reportViewer1.LocalReport.LoadReportDefinition(rdlcSR);

      reportViewer1.LocalReport.Refresh();
  }

似乎对我很有效。

6uxekuva

6uxekuva4#

正如你所说的,因为rdlc需要某种类型的数据源:)这是一个棘手的问题,在报表查看器和解决它,我写了一个方法,将绑定报表直接从Datatable:

private void GenerateReportDirect(ReportViewer reportViewer, string datasource, DataTable dt, string reportpath)
{
    reportViewer.LocalReport.ReportPath = reportpath;
    ReportDataSource repds = new ReportDataSource(datasource, dt);
    reportViewer.LocalReport.DataSources.Clear();
    reportViewer.LocalReport.DataSources.Add(repds);
    reportViewer.LocalReport.Refresh();
}

要实现此方法,您必须指定将datasetableadapter的字符串仅作为名称,但我们的报表将从数据表中获取要绑定的数据(我们将欺骗报表查看器:))

private void BindReport(DataTable dt)
    {
            string reportPath = Server.MapPath("StudentBus.rdlc");
            GenerateReportDirect(ReportViewer1, "StudentDataSet_usp_RPT_StudentBus", dt, reportPath);
    }

我希望这会有帮助:)。

fnx2tebb

fnx2tebb5#

我的一个报告也出现了同样的问题,那是一个本地的嵌入式报告。
1.我没有设置ReportEmbeddedResource属性。
1.当我确实设置了ReportEmbeddedResource property时,它仍然给出了错误,因为报告名称的大小写不正确-myApp.reports.rptMyJobstatus.rdlc而不是myApp.reports.rptMyJobStatus.rdlc
因此,您需要检查这两个条件。

83qze16e

83qze16e6#

如果您在代码中设置ReportEmbeddedResource属性而不是报表路径,则将生成操作属性从XYZ.rdlc文件的属性更改为嵌入式资源将帮助您解决大部分问题。

相关问题