了解.rdlc报告存在大量问题。
我的情况是: 我有一个带有传入参数的过程,但有多个选择结果。 当我尝试使用数据集添加它时,没有任何反应,但任何其他过程(结果只有一个选择)按预期工作(它出现在“可用数据集”中。
据我所知,我可以自己创建DataSet并以某种方式发送.rdlc格式,但我根本无法得到它(例如,我之后应该如何设计.rdlc)。< / p>
现在我收到了4个包含来自存储过程的数据的列表,我需要在.rdlc中发送这些数据。我怎么能做到这一点?
答案 0 :(得分:0)
默认情况下,报告向导仅采用存储过程的第一个结果集。您可以处理来自ASP.NET WebForms应用程序中以编程方式生成的.rdlc中的存储过程的多个结果集,但这并不简单......至少我知道怎么做的方式不是'吨。例如,以下proc返回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;
现在,您必须手动将数据集添加到报告文件中。创建一个空白的报表项并在文本编辑器中打开(在Visual Studio中,您可以右键单击.rdlc文件,单击打开方式...并选择Xml编辑器以获得漂亮的颜色。).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时遇到麻烦。无论如何,我希望这有助于指导您的功能方向!