You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:18:23