将数据从ASP.NET C#,ProcessingMode = Remote中的代码传递到ssrs报告(.rdl)

Irf*_*Irf 1 asp.net reportviewer reporting-services ssrs-2008 c#-4.0

我可以看到有很多问题已经被问到同样的事情:

以编程方式将数据源绑定到报表服务器中的rdl - SSRS

SSRS使用Xml数据源[WCF],它可能,但它是否可取?

和许多其他人......

但是,我真正想要的是在我开始之前得到你宝贵的意见,最后发现自己处于死胡同!

我们正在BIDS SSRS 2008环境中开发报告,VS 2010用于Web应用程序.与ReportViewer 10一起使用ProcessingMode="Remote"

到目前为止,一切都很好..将参数传递给报告,与asp.net集成等等.我的意思是,通过SQL查询获取数据(有时通过参数过滤).我可以使用存储过程,一切正常.

但现在,有些报告需要根据用户在asp.net网页上从前端(GridView)中选择的数据动态生成,然后在报表上显示该数据.

也就是说,如果用户在GridView上选择10行并单击打印按钮,则只应在报告中显示这10行(以及其他一些报告特定数据).这就是我们现在正在升级的遗留系统中的内容.
当然,这不能仅通过传递参数来实现,因为GridView上的数据选择完全取决于用户,并且都是动态的...我现在正在修理!

那么,对于这些情况,最好的方法是什么?

PS(编辑):有解决方案,但他们更关注.rdlc,我在谈论.rdl

Irf*_*Irf 6

最后我们像下面这样实现它.我想可能对其他人有用.所以发布我的解决方案:
这可以通过XML的实现来完成
首先将您的数据转换为XML,如下所示:

private void ConvertToXml(ref XmlDocument xm)
{
 const string header = @"<ENVELOPE>";
 var strenvelopes = "";
 GridItemCollection selectedRows;
 selectedRows = dgAddressList.SelectedItems;

if (selectedRows.Count > 0)
{
 foreach (GridItem item in dgAddressList.SelectedItems)
 {                 
  strenvelopes += @"<ADDRESS>" + 
  "<NAME>" + "<![CDATA[" + ((object[])(item.DataItem))[2].ToString() + "]]>" + "</NAME>" +
  "<CONTACT>" + "<![CDATA[" + ((object[])(item.DataItem))[1].ToString() + "]]>" + "</CONTACT>" +
  "<STREET>" + "<![CDATA[" + ((object[])(item.DataItem))[3].ToString() + "]]>" + "</STREET>" +
  "<SUBURBSTATE>" + "<![CDATA[" + ((object[])(item.DataItem))[4].ToString() + "]]>" + "</SUBURBSTATE>" +
  "</ADDRESS>";                  
  }
}

   const string footer = @"</ENVELOPE>";  

   var envelopes = header + strenvelopes + footer;
   xm.LoadXml(envelopes);
}
Run Code Online (Sandbox Code Playgroud)

您需要替换 ((object[])(item.DataItem))[].ToString()您自己的值
然后生成您的报告,如下所示:

private void GenerateReport()
{
       var xm = new XmlDocument();
       ConvertToXml(ref xm);
       var xml = xm.InnerXml.ToString();
       rptViewer = ucrvEnvelope.FindControl("rptViewer") as ReportViewer;
       if (rptViewer != null)
       {
           rptViewer.ProcessingMode = ProcessingMode.Remote;              
           rptViewer.ServerReport.ReportServerUrl = new Uri("http://localhost/MyReports");
           rptViewer.ServerReport.ReportPath = "/Reporting/rptEnvelope";
           rptViewer.PromptAreaCollapsed = true;
       }
        ReportParameter myParam = new ReportParameter("list", xml);
        rptViewer.ServerReport.SetParameters(new ReportParameter[] { myParam });
        rptViewer.ShowParameterPrompts = false;
        rptViewer.ShowBackButton = true;
        rptViewer.ServerReport.Refresh();
  }
Run Code Online (Sandbox Code Playgroud)

您应该在报表中添加参数 "list".因为我们将"list"通过以下数据集传递整个XML的东西,

现在将处理这个XML的数据集:
通常,我们所做的是你编写一些存储过程或在数据集中写一些查询,因为我们的是XML,它需要以XML方式处理,
Query Type: Text写下面的查询来处理在XML数据

DECLARE @docHandle int DECLARE @xmlDocument varchar(max); DECLARE @listXML nvarchar(max)
SET @listXML = @list
SET @xmlDocument = @listXML EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
    SELECT * FROM OPENXML (@docHandle, N'/ENVELOPE/ADDRESS') WITH
    (
      NAME nvarchar(max) 'NAME',
      CONTACT nvarchar(max) 'CONTACT',
      STREET nvarchar(max) 'STREET',
      SUBURBSTATE nvarchar(max) 'SUBURBSTATE'
    )
Run Code Online (Sandbox Code Playgroud)

田野NAME,CONTACT等要与你创造的东西摆在首位的XML文档一样,在顶部ConvertToXML

所以最重要的是,你没有通过数据库中的strored过程传递数据,但你是从aspx页面中获取数据 - 代码隐藏并将其转换为XML并通过此数据集将其传递给报表服务器报告
所以什么在后面代码传递给您的报告 .. !