RDLC报表无数据问题:实现RDLC报表转PDF(附代码)
解决RDLC报表无数据显示的问题
从你贴的代码片段来看,报表空数据的问题基本出在数据获取、填充和数据源绑定这几个环节上,我帮你梳理几个关键的排查和修复步骤:
1. 先把数据查询和DataTable填充做对
你当前的查询只取了FirstName单个字段:
var entities_data = from c in Entities.Orders select c.FirstName;
但报表依赖的是DataSet1.Tables["Orders"]这个DataTable,它需要包含报表设计时用到的所有字段,而不是孤零零的一个名字。你得完整查询订单数据,再把数据塞进DataTable里。
给你个修改示例:
// 先把数据库里的订单数据完整查出来 var ordersList = Entities.Orders.ToList(); // 循环把每条数据填充到DataTable的行里 foreach (var order in ordersList) { DataRow newRow = ordersTable.NewRow(); // 这里要对应你DataSet里Orders表的字段,比如OrderId、FirstName、OrderDate这些 newRow["OrderId"] = order.OrderId; newRow["FirstName"] = order.FirstName; newRow["OrderDate"] = order.OrderDate; // 其他报表用到的字段也得一一赋值 ordersTable.Rows.Add(newRow); }
如果你的实体类和DataSet的字段完全匹配,也可以用更简便的方式:
var ordersList = Entities.Orders.ToList(); ordersTable.Load(new ObjectReader(ordersList)); // 注:需要引用System.Data.Entity.Design库,或者自己写个实体转DataRow的工具类
2. 确认数据源名称完全匹配
RDLC报表里定义的数据源名称,必须和代码里ReportDataSource的名称完全一致(大小写都不能错)。比如你报表里的数据源叫DataSet1_Orders,那代码里就得这么写:
// 这里的第一个参数一定要和RDLC里的数据源名称一模一样 localreport.DataSources.Add(new ReportDataSource("DataSet1_Orders", ordersTable));
你贴的代码写到new ReportDataSourc...就断了,这部分一定要补全,名称错了报表根本认不到数据。
3. 先确认数据库里真的有数据
填充完DataTable后,加一行调试代码看看:
// 看看DataTable里到底有没有行 int rowCount = ordersTable.Rows.Count;
如果rowCount是0,那说明从数据库里根本没查到数据,得先去检查Entities.Orders对应的数据库表有没有记录,而不是纠结报表的问题。
4. 检查报表设计里的绑定是否正确
打开RDLC报表设计器,确认这两点:
- 报表里的表格(Tablix)是绑定到正确的数据集上的
- 表格里的每一列,都是绑定到数据集的对应字段,不是空值或者写错了字段名
5. 给你一个完整的参考代码模板
你可以对照着补全自己的代码:
public ActionResult Reports(string ReportType) { // 用using自动释放数据库上下文,避免资源泄漏 using (MyApplication_dbEntities Entities = new MyApplication_dbEntities()) { DataSet1 dataSet = new DataSet1(); DataTable ordersTable = dataSet.Tables["Orders"]; // 获取完整订单数据 var ordersData = Entities.Orders.ToList(); if (ordersData.Any()) { // 填充DataTable foreach (var order in ordersData) { DataRow row = ordersTable.NewRow(); row["OrderId"] = order.OrderId; row["FirstName"] = order.FirstName; row["OrderDate"] = order.OrderDate; // 补充报表需要的其他字段 ordersTable.Rows.Add(row); } } LocalReport localReport = new LocalReport(); localReport.ReportPath = Server.MapPath("~/Reports/Report1.rdlc"); // 数据源名称必须和RDLC里的一致 localReport.DataSources.Add(new ReportDataSource("DataSet1_Orders", ordersTable)); // 生成PDF的完整逻辑 string mimeType; string encoding; string fileNameExtension; Warning[] warnings; string[] streams; string deviceInfo = @"<DeviceInfo> <OutputFormat>PDF</OutputFormat> <PageWidth>8.5in</PageWidth> <PageHeight>11in</PageHeight> <MarginTop>0.5in</MarginTop> <MarginLeft>0.5in</MarginLeft> <MarginRight>0.5in</MarginRight> <MarginBottom>0.5in</MarginBottom> </DeviceInfo>"; byte[] renderedBytes = localReport.Render( ReportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); return File(renderedBytes, mimeType); } }
内容的提问来源于stack exchange,提问作者user5303319
相关产品推荐
相关产品推荐

