1

我正在使用 MVC4 和实体框架来开发 Intranet Web 应用程序,其中一项要求是该应用程序将能够创建报告。所以我正在使用报告服务来做到这一点。

在我的报告文件 (.rdlc) 中,我有一个表,它应该包含我在表“Persons”中的所有记录。我创建了一个存储过程,它从我的数据库中获取所有人员以及一个允许下载报告的操作。

事情是,我不知道如何告诉我的操作我的数据源是我的存储过程。

这是我的行动:

public ActionResult PersonReport()
{

    ReportViewer personReportViewer = new ReportViewer();

    List<ReportParameter> reportParameters = new List<ReportParameter>();

    reportParameters.Add(new ReportParameter("Title", "Test"));

    personReportViewer.LocalReport.SetParameters(reportParameters);

    personReportViewer.ProcessingMode = ProcessingMode.Local;
    personReportViewer.LocalReport.ReportEmbeddedResource = 
       HttpContext.Server.MapPath(".") + "\\Reporting\\Templates\\"
        + "PersonReport.rdlc";

    byte[] byteArray = personReportViewer.LocalReport.Render("PDF");

    Response.ClearHeaders();
    Response.AddHeader("Content-Disposition", 
         "attachment; Filename=\"" + DateTime.Now + "_Title_" + "\"");
    Response.AddHeader("Content-Transfer-Encoding", "Binary");
    Response.BinaryWrite(byteArray);
    Response.Flush();
    Response.End();

    return RedirectToAction("Index");
}

这是我的存储过程:

ALTER PROCEDURE dbo.GetAllPersons

AS

BEGIN

    SET NOCOUNT ON

    SELECT * FROM  bm_Persons;

END

关于如何做到这一点的任何想法?非常感谢。

4

2 回答 2

3

您需要运行该过程并将结果传递给 ReportViewer。
但是你是如何做到的,目前无法回答。您是否使用普通的旧 ADO.NET 连接到您的数据库、实体框架或 NHibernate 等...

您的存储过程将返回结果集合,因此我会将其分配给一个变量并将其传递给 ReportViewer。或者有一个方法GetAllPersons返回一个ArrayorIList<T>或其他合适的类型,然后你可以在你的方法范围之外使用它。

鉴于您正在使用 EF,那么为了从您的存储过程中获得一组结果,您将需要一个类似于我从我在评论中提到的答案中获取的方法:

public static DataSet ExecuteStoredProcedure(ObjectContext db, 
                                             string storedProcedureName, 
                                             IEnumerable<SqlParameter> parameters)
{
    var connectionString = 
        ((EntityConnection)db.Connection).StoreConnection.ConnectionString;
    var ds = new DataSet();

    using (var conn = new SqlConnection(connectionString))
    {
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = storedProcedureName;
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (var parameter in parameters)
            {
                cmd.Parameters.Add(parameter);
            }

            using (var adapter = new SqlDataAdapter(cmd))
            {
                adapter.Fill(ds);
            }
        }
    }

    return ds;
}
于 2013-04-05T13:26:03.653 回答
3

我认为您需要设置ReportViewer1.LocalReport.DataSources

SqlCommand cmd = new SqlCommand();

cmd.Parameters.Add(new SqlParameter("@StartDate", startDate)); 
cmd.Parameters.Add(new SqlParameter("@EndDate", endDate)); 

var thisConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString; 

SqlConnection thisConnection = new SqlConnection(thisConnectionString); 

cmd.Connection = thisConnection; 

cmd.CommandText = string.Format("[dbo].[StoredProcedureName]"); 
cmd.CommandType = CommandType.StoredProcedure; 
SqlDataAdapter da = new SqlDataAdapter(cmd); 

System.Data.DataSet thisDataSet = new System.Data.DataSet(); 

da.Fill(thisDataSet); 


////////////
/// HERE ///
////////////
ReportDataSource datasource = new ReportDataSource(rptName, thisDataSet.Tables[0]); 

ReportViewer1.LocalReport.DataSources.Clear(); 
ReportViewer1.LocalReport.DataSources.Add(datasource); 

....................

ReportViewer1.LocalReport.Refresh();
于 2013-04-05T13:27:36.400 回答