31

我们希望将 Microsoft Reports - SSRS 添加到我们的内部网站之一。

该数据库已安装所有报告功能。

该网站对所有数据使用 Entity Framework 4。

我已经能够使用创建数据集 (*.XSD) 的老式方法创建报告,并且效果很好。

不过,我的问题是,是否可以利用站点中现有的实体框架来获取报告所需的数据?而不必重新发明轮子并制作整个数据集以及关系等。

这是一个网站而不是应用程序,所以这个(http://weblogs.asp.net/rajbk/archive/2010/05/09/creating-an-asp-net-report-using-visual-studio-2010-part- 1.aspx ) 似乎不适用;我没有看到 DataSource(在教程的第 2 部分)

更新

作为旁注,我们希望避开昂贵的第三方控件等。

此外,另一种看待问题的方法可能是从实体框架实体模型生成 *.XSD;这可能吗?这并不理想,但会让我们启动并运行..

4

6 回答 6

9

下面是我如何在我的一个 .NET winForms 应用程序中设置报表数据源的快速示例。

public  void getMyReportData()
    {
        using (myEntityDataModel v = new myEntityDataModel())
        {

            var reportQuery = (from r in v.myTable
                                   select new
                                   {
                                       l.ID,
                                       l.LeaveApplicationDate,
                                       l.EmployeeNumber,
                                       l.EmployeeName,
                                       l.StartDate,
                                       l.EndDate,
                                       l.Supervisor,
                                       l.Department,
                                       l.Col1,
                                       l.Col2,
                                       .......,
                                       .......,
                                       l.Address
                                   }).ToList();


            reportViewer1.LocalReport.DataSources.Clear();
            ReportDataSource datasource = new ReportDataSource("nameOfReportDataset", reportQuery);
            reportViewer1.LocalReport.DataSources.Add(datasource);

            Stream rpt = loadEmbededReportDefinition("Report1.rdlc");
            reportViewer1.LocalReport.LoadReportDefinition(rpt);
            reportViewer1.RefreshReport();

            //Another way of setting the reportViewer report source

            string exeFolder = Path.GetDirectoryName(Application.ExecutablePath);
            string reportPath = Path.Combine(exeFolder, @"rdlcReports\Report1.rdlc");
            reportViewer1.LocalReport.ReportPath = reportPath;

            reportParameter p = new ReportParameter("DeptID", deptID.ToString());
            reportViewer1.LocalReport.SetParameters(new[] { p });

        }
    }




    public static Stream loadEmbededReportDefinition(string reportName)
        {
            Assembly _assembly = Assembly.GetExecutingAssembly();
            Stream _reportStream = _assembly.GetManifestResourceStream("ProjectNamespace.rdlcReportsFolder." + reportName);

            return _reportStream;
        }
于 2013-04-24T12:03:38.387 回答
8

我的方法一直是使用带有对象数据源的 RDLC 文件并以“本地”模式运行它们。这些数据源是……我的实体!通过这种方式,我使用了与我的 Web 应用程序相同的所有业务逻辑、字符串格式、文化意识等。有一些怪癖,但我已经能够忍受它们:

  • RDLC 文件不喜欢存在于 Web 项目中。我们创建一个单独的虚拟 winform 项目并在其中添加 RDLC 文件。
  • 我不在查看器中显示报告。我让用户下载 PDF、Word 或 Excel 文件并选择在本机查看器中保存或打开。这可以省去很多麻烦,但可能会让一些人望而却步,具体取决于要求。对于移动设备,它非常好。
  • 由于您没有使用 SSRS,因此您无法获得不错的订阅功能。如果需要,您将构建它。不过,在很多方面,我更喜欢这个。

但是,好处真的很不错:

  • 我正在使用我已经为我的观点编写的所有相同的业务逻辑优点。
  • 我有一个自定义 ReportActionResult 和 DownloadReport 控制器方法,它允许我通过单个 URL 运行任何报告。这非常方便。它确实使自定义订阅组件更容易。
  • 报告开发似乎进展得很快,现在我只需要调整实体部分类即可在此处或那里进行一些调整。另外 - 如果我需要稍微不同地塑造数据,我有 LINQ。
于 2013-05-16T17:38:02.047 回答
2

我们也将 SSRS 用作“本地”报告。我们在 SQL 服务器中创建视图,然后在我们的应用程序中创建该对象以及其他 EF 域模型,并使用我们的 DbContext 查询该对象。我们使用 ASPX 页面并使用后面的代码 (Page_Load) 来获取传递给报表的数据。

这是我们如何在 Page_Load 事件中查询它的示例:

        var person = MyDbContext
            .Query<ReportModel>()
            .Where(x => x.PersonId == personId)
            .Where(x => x.Year == year)
            .Select(x =>
            {
                PersonId = x.PersonId,
                Year = x.Year,
                Name = x.Name
            });

        var datasource = new ReportDataSource("DataSet1", person.ToList());

        if (!Page.IsPostBack)
        {
            myReport.Visible = true;
            myReport.ProcessingMode = ProcessingMode.Local;
            myReport.LocalReport.ReportPath = @"Areas\Person\Reports\PersonReport.rdlc";
        }

        myReport.LocalReport.DataSources.Clear();
        myReport.LocalReport.DataSources.Add(datasource);
        myReport.LocalReport.Refresh(); 
于 2015-06-09T19:00:41.840 回答
1

诀窍是创建一个带有空白数据源连接字符串、空白查询块和空白 DataSetInfo 的报告 (.rdlc)(我必须手动修改 xml)。它们必须存在于文件中并且为空,如下所示:

SomeReport.rdlc (viewing as xml)
...
<DataSources>
    <DataSource Name="conx">
    <ConnectionProperties>
    <DataProvider />
    <ConnectString />
    </ConnectionProperties>
    <rd:DataSourceID>19f59849-cdff-4f18-8611-3c2d78c44269</rd:DataSourceID>
    </DataSource>
</DataSources>
...
<Query>
    <DataSourceName>conx</DataSourceName>
    <CommandText />
    <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
</Query>
<rd:DataSetInfo>
    <rd:DataSetName>SomeDataSetName</rd:DataSetName>
</rd:DataSetInfo>

现在在页面事件中,我在 DropDownList 上使用 SelectedIndexChanged,将报表数据源绑定如下:

protected void theDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
    if (theDropDownList.SelectedIndex == 0)
        return;

    var ds = DataTranslator.GetRosterReport(Int64.Parse(theDropDownList.SelectedValue));
    _rvReport.LocalReport.ReportPath = "SomePathToThe\\Report.rdlc";
    _rvReport.LocalReport.DataSources.Add(new ReportDataSource("SomeDataSetName", ds));
    _rvReport.Visible = true;
    _rvReport.LocalReport.Refresh();

}
于 2013-04-29T19:48:19.217 回答
0

您可以将 WCF 服务用作数据源,从而将应用程序数据和逻辑重新用于报表。至少我相信这需要一个 SQL-server 标准版。所以不能使用免费的 SQL-express 版本。

于 2013-03-11T15:55:06.907 回答
0

您可以将LINQRDLC Report一起使用,这非常容易使用

LinqNewDataContext db = new LinqNewDataContext();
var query = from c in db.tbl_Temperatures
                    where c.Device_Id == "Tlog1"
                    select c;
var datasource = new ReportDataSource("DataSet1", query.ToList());
ReportViewer1.Visible = true;
ReportViewer1.ProcessingMode = ProcessingMode.Local;
ReportViewer1.LocalReport.ReportPath = @"Report6.rdlc";    
ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(datasource);
ReportViewer1.LocalReport.Refresh();
于 2016-11-01T10:07:00.900 回答