2017-03-20 22 views
1

理解.rdlc报告存在大量问题。如何从RDLC中的存储过程获取多个表?

我的情况是: 我有一个传入参数的过程,但有多个选择结果。 当我尝试添加它与数据集,什么也没有发生,但任何其他程序(其中结果只有一个选择)按预期工作(它出现在“可用的数据集”中)

据我所知,可以创建DataSet由我自己发送,并以.rdlc格式发送,不过我无法得到它(例如,我应该如何设计.rdlc之后)。

现在我收到4个与数据列表存储过程,我需要发送那些里面.rdlc。我怎么能做到这一点?

+0

尝试将存储过程分解为4个部分,然后将每个作为单独的数据集添加到RDLC中。 – Chuck

回答

0

默认情况下,报告向导将只采取存储过程的第一个结果集。您可以处理一个存储过程中的多个结果集,该结果集以编程方式在ASP.NET WebForms应用程序中生成的.rdlc中,但这并不简单......至少我知道如何去做的方式不是这样。以下面的过程为例,返回3个结果集:

CREATE PROCEDURE Multipass 
AS 
    DECLARE @t table (ID int, SomeText varchar(256)); 
    SELECT ID AS FirstID, SomeText AS FirstName FROM @t; 
    SELECT ID AS SecondID, SomeText AS SecondName FROM @t; 
    SELECT ID AS ThirdID, SomeText AS ThirdName FROM @t; 
    RETURN 0; 

现在,您必须手动将数据集添加到报告文件。创建一个空白的Report项并在文本编辑器中打开(在Visual Studio中,您可以右键单击.rdlc文件,单击Open With ...并选择Xml Editor以获得漂亮的颜色。).rdlc的完整XML与数据集为增加会是这个样子上面的存储过程:

<?xml version="1.0" encoding="utf-8"?> 
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"> 
    <Width>6.5in</Width> 
    <Body> 
    <Height>2in</Height> 
    </Body> 
    <rd:ReportTemplate>true</rd:ReportTemplate> 
    <Page> 
    </Page> 
    <DataSources> 
    <DataSource Name="Whatever"> 
     <DataSourceReference>Whatever</DataSourceReference> 
     <rd:DataSourceID>b257dc38-aff2-4fac-9e8b-73ea232f5ca8</rd:DataSourceID> 
    </DataSource> 
    </DataSources> 
    <DataSets> 
    <DataSet Name="DataSet0"> 
     <Fields> 
     <Field Name="FirstID"> 
      <DataField>FirstID</DataField> 
      <rd:TypeName>System.int</rd:TypeName> 
     </Field> 
     <Field Name="FirstName"> 
      <DataField>FirstName</DataField> 
      <rd:TypeName>System.string</rd:TypeName> 
     </Field> 
     </Fields> 
     <Query> 
     <DataSourceName>Whatever</DataSourceName> 
     <CommandType>StoredProcedure</CommandType> 
     <CommandText>dbo_multipass</CommandText> 
     </Query> 
    </DataSet> 
    <DataSet Name="DataSet1"> 
     <Fields> 
     <Field Name="SecondID"> 
      <DataField>SecondID</DataField> 
      <rd:TypeName>System.int</rd:TypeName> 
     </Field> 
     <Field Name="SecondName"> 
      <DataField>SecondName</DataField> 
      <rd:TypeName>System.string</rd:TypeName> 
     </Field> 
     </Fields> 
     <Query> 
     <DataSourceName>Whatever</DataSourceName> 
     <CommandType>StoredProcedure</CommandType> 
     <CommandText>dbo_multipass</CommandText> 
     </Query> 
    </DataSet> 
    <DataSet Name="DataSet2"> 
     <Fields> 
     <Field Name="ThirdID"> 
      <DataField>ThirdID</DataField> 
      <rd:TypeName>System.int</rd:TypeName> 
     </Field> 
     <Field Name="ThirdName"> 
      <DataField>ThirdName</DataField> 
      <rd:TypeName>System.string</rd:TypeName> 
     </Field> 
     </Fields> 
     <Query> 
     <DataSourceName>Whatever</DataSourceName> 
     <CommandType>StoredProcedure</CommandType> 
     <CommandText>Multipass</CommandText> 
     </Query> 
    </DataSet> 
    </DataSets> 
</Report> 

请注意,我用命名后,一些每个数据集,这是在使用模板来生成报告的代码很重要。这样做下面这将遍历从存储过程结果集的收集,并将它们添加到报告渲染:

private byte[] GetReport() 
{ 
    Microsoft.Reporting.WebForms.Warning[] warnings = null; 
    string[] streamids = null; 
    string mimeType = null; 
    string encoding = null; 
    string extension = null; 
    byte[] bytes = null; 
    try 
    { 
     // Retrieve the dataset from your stored proc which will contain a DataTable object for each resultset 
     DataSet ds = this.GetMultipass(); 

     // Instantiate a report object using your new spiffy template 
     Microsoft.Reporting.WebForms.LocalReport rpt = new Microsoft.Reporting.WebForms.LocalReport(); 
     rpt.ReportPath = "path_to_your_report.rdlc"; 
     rpt.DataSources.Clear(); 

     // Now we loop through the tables and add them as ReportDataSource objects to the LocalReport object 
     for (int i = 0; i <= ds.Tables.Count - 1; i++) 
     { 
      // Note that we name each datasource DataSet0, DataSet1, DataSet2 to match the DataSet names in the .rdlc. Kinda important. 
      rpt.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource($"DataSet{(i > 0 ? i.ToString() : "")}", ds.Tables[i])); 
     } 

     // Adjust the render to how you want the output 
     bytes = rpt.Render("EXCELOPENXML", null, out mimeType, out encoding, out extension, out streamids, out warnings); 
    } 
    catch (Exception ex) 
    { 
     // Blame the internet for misguiding you 
    } 
    return bytes; 
} 

有可能是一个更好的方式来做到这一点,并希望有一种方法可以做到这没有WebForms,或者当我最终将我的应用程序迁移到MVC时,我遇到了麻烦。无论如何,我希望这有助于指导你的功能方向!

相关问题