从C#调用SSRS报告时,只有主报告显示数据子报告给出错误

时间:2015-09-04 12:48:19

标签: c# reporting-services ssrs-2008 subreport

我开发了一份SSRS报告,其中包含一个主报告和一个子报告。 我从C#调用此报告。 我只知道如何将主rdlc与数据集绑定。

我使用下面的代码

SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl";
 this.reportViewer1.LocalReport.DataSources.Clear();
 this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
this.reportViewer1.RefreshReport();

当我运行exe时,我正在使报表查看器填充主报表,但是3子报表显示错误,因为我没有为这些子报表指定DataSource

enter image description here

  1. 主报告和其他子报告之间没有参数传递
  2. main和all子报告的数据集名称默认为DataSet1
  3. 请指导我将子报告与适当的查询数据集表绑定。 我完全被困在这里。

    被修改

    我用1个子报告更改了我的项目。

    在SSRS中它在(BIDS)编辑器中工作正常,但是当从C#调用它时会出错:

      

    在指定位置找不到。请验证子报表是否已发布且名称是否正确。

    我的代码:

    subreportevenhandler according to this question
    

    question for subreport event handler

     SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
        dataAdapter.Fill(dataset);
        this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl";
         this.reportViewer1.LocalReport.DataSources.Clear();
    this.reportViewer1.LocalReport.SubreportProcessing +=
                    new SubreportProcessingEventHandler(addsubreport);
         this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
        this.reportViewer1.RefreshReport();
    
    
    
    
    void addsubreport(object sender, SubreportProcessingEventArgs e)
            {
                SqlConnection conn = new SqlConnection(source);
                DataSet dataset = new DataSet();
                conn.Open();
    
               SqlCommand sqlcomm = new SqlCommand( "Query for subreport", conn);
    
               SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
               dataAdapter.Fill(dataset);
    
               e.DataSources.Add(new ReportDataSource("DataSet1", dataset.Tables[0]));
            }
    

    我仍然收到子报告的错误 我将所有.rdl文件移动到C#bin文件夹..

    enter image description here

    主报告正确显示数据。在SSRS中罚款......

1 个答案:

答案 0 :(得分:1)

我发现了这个问题。我发布它作为答案,因为它可能在将来帮助某人。

SubreportProcessingEventHandler只会被.rdlc个子报告触发。 在我的项目主报告中,所有子报表都是.rdl扩展名。 因此,只有我完成的更改才转到命令提示符,并将子报表扩展名重命名为.rdlc

例如: - ren discount.rdl discount.rdlc

然后相应地附加子报告的数据集。

请参阅以下代码

SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm);
dataAdapter.Fill(dataset);
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\main_rpt.rdl";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.SubreportProcessing +=
new SubreportProcessingEventHandler(addsubreport);
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0]));
this.reportViewer1.RefreshReport();


void addsubreport(object sender, SubreportProcessingEventArgs e)
{

SqlCommand sqlcomm = new SqlCommand();
SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataSet dataset = new DataSet();

Switch(e.ReportPath)
{
case "subreport1":
   sqlcomm = new SqlCommand( "Query for subreport one", conn);
   dataAdapter = new SqlDataAdapter(sqlcomm);
   dataAdapter.Fill(dataset);
   e.DataSources.Add(new ReportDataSource("DataSet for subreport1", dataset.Tables[0]));
   break;
case "subreport2":
   sqlcomm = new SqlCommand( "Query for subreport two", conn);
   dataAdapter = new SqlDataAdapter(sqlcomm);
   dataAdapter.Fill(dataset);
   e.DataSources.Add(new ReportDataSource("DataSet for subreport2", dataset.Tables[0]));
   break;
case "subreport3":
   sqlcomm = new SqlCommand( "Query for subreport three", conn);
   dataAdapter = new SqlDataAdapter(sqlcomm);
   dataAdapter.Fill(dataset);
   e.DataSources.Add(new ReportDataSource("DataSet for subreport3", dataset.Tables[0]));
   break;

 }

}

如果您有多个子报告,则需要切换。需要注意的要点

  1. 所有子报告都应该有扩展名.rdlc
  2. 2.如果任何参数正在传递,请确保它也被正确命名。

    1. 正确指定路径。将主报表和子报表放在同一文件夹中会更好。
    2. 现在运行C#应用程序,它将显示包含所有子报告的主报告