VS2022 API调用RDLC生成PDF报无法为DataSet1创建数据读取器错误
问题根因
该报错核心原因:Report Builder中配置的内嵌数据源、内联SQL查询,仅在Report Builder自身预览环境下会自动连接数据库执行取数。Microsoft.Reporting.NETCore 提供的 LocalReport 为纯本地渲染模式,不会自动读取rdlc文件内的数据源连接配置,也不会自动执行文件内存储的内联SQL查询获取数据。代码中未给DataSet1手动绑定对应业务数据时,渲染阶段找不到数据集对应的数据源,就会抛出无法创建数据读取器的异常。
另外代码中存在一处路径配置错误:你创建的是rdlc格式报表,路径拼接时写的后缀为.rdl,后缀不匹配会导致加载错误的报表定义。
修复步骤
- 修正报表文件路径后缀
将路径拼接逻辑中的.rdl替换为实际报表文件的.rdlc后缀,确保程序加载正确的报表定义文件。 - 手动查询报表所需业务数据
不要依赖rdlc文件内编写的内联SQL,在API业务代码中通过项目常用的数据库访问组件(EF Core、Dapper、原生SqlClient均可),传入报表参数执行查询,得到字段结构、数据类型与rdlc中DataSet1定义完全一致的结果集,支持DataTable、强类型集合等格式。 - 给本地报表实例绑定数据源
在调用SetParameters方法之后、执行Render方法之前,将查询得到的结果集绑定到对应名称的报表数据源上。 - 校验字段映射一致性
确认绑定的数据源字段名、数据类型和rdlc文件内DataSet1的字段定义完全匹配,避免因字段名大小写不一致、类型不兼容导致的二次渲染错误。
修正后核心代码
string _CurrentDirectorypath = Directory.GetCurrentDirectory(); string _MapPath = _CurrentDirectorypath; // 修正文件后缀为.rdlc var path = Path.Combine(_MapPath, "wwwroot", "Report", "<实际报表文件名>.rdlc"); using var reportDefinition = new FileStream(path, FileMode.Open, FileAccess.Read); LocalReport report = new LocalReport(); report.LoadReportDefinition(reportDefinition); var parameters = new List<ReportParameter>(); parameters.Add(new ReportParameter("<Param1>", "<ParamValue>")); report.SetParameters(parameters.ToList()); // 新增:查询数据并绑定到指定数据集 // 替换为自身业务的数据库查询逻辑,传入参数做数据过滤 DataTable reportSourceData = GetReportDataFromDatabase("<ParamValue>"); report.DataSources.Add(new ReportDataSource("DataSet1", reportSourceData)); try { return new PDFFileInBytes { Content = report.Render("PDF"), FileName = "file.pdf", MimeType = "application/pdf" }; } catch (Exception e) { _logger.LogError(e, "Failed to Generate TokenReportEnglish."); throw; }
内容的提问来源于stack exchange,提问作者HarishFullStack
相关产品推荐
相关产品推荐

