Dapper怎么返回一个DataSet Dapper填充DataSet方法

来源:APP编程网作者:河北彩花头衔:网络博主
导读:本期聚焦于小伙伴创作的《Dapper怎么返回一个DataSet Dapper填充DataSet方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Dapper怎么返回一个DataSet Dapper填充DataSet方法》有用,将其分享出去将是对创作者最好的鼓励。

Dapper本身的设计定位是轻量高效的ORM,核心能力是完成实体对象和数据库查询结果的直接映射,并没有内置直接返回DataSet的方法。如果项目中需要基于Dapper获取DataSet,可以通过Dapper查询得到原始数据后,结合ADO.NET的相关组件手动完成DataSet的填充。

Dapper怎么返回一个DataSet Dapper填充DataSet方法

Dapper填充DataSet的核心思路

要实现Dapper返回DataSet,核心逻辑分为两步:首先使用Dapper执行查询,获取到IDataReader类型的查询结果;然后借助ADO.NET的DataAdapter组件,将IDataReader中的数据填充到DataSet中。整个流程不需要额外引入复杂的依赖,仅需要基础的ADO.NET组件支持即可完成。

单结果集填充DataSet的实现

当执行的查询只返回一个结果集时,填充逻辑比较简单,示例代码如下:

using System.Data;
using System.Data.SqlClient;
using Dapper;

public class DapperDataSetHelper
{
    private readonly string _connectionString;
    
    public DapperDataSetHelper(string connectionString)
    {
        _connectionString = connectionString;
    }
    
    // 单结果集查询填充DataSet
    public DataSet QueryToDataSet(string sql, object param = null)
    {
        DataSet dataSet = new DataSet();
        using (IDbConnection connection = new SqlConnection(_connectionString))
        {
            // 执行Dapper查询,获取IDataReader
            IDataReader dataReader = connection.ExecuteReader(sql, param);
            // 使用DataAdapter填充DataSet
            using (IDataAdapter adapter = new SqlDataAdapter())
            {
                // 通过反射设置DataAdapter的SelectCommand的Reader属性
                var selectCommandType = typeof(SqlDataAdapter).GetProperty("SelectCommand");
                var selectCommand = selectCommandType.GetValue(adapter);
                var readerProperty = selectCommand.GetType().GetProperty("Reader");
                readerProperty.SetValue(selectCommand, dataReader);
                adapter.Fill(dataSet);
            }
        }
        return dataSet;
    }
}

上述代码中,首先通过Dapper的ExecuteReader方法获取查询返回的IDataReader对象,然后创建SqlDataAdapter实例,将IDataReader赋值给适配器的查询命令的Reader属性,最后调用Fill方法完成DataSet的填充。

多结果集填充DataSet的实现

如果执行的查询返回多个结果集,比如一次性查询多张表的数据,需要为每个结果集创建对应的DataTable,再依次添加到DataSet中,示例如下:

using System.Data;
using System.Data.SqlClient;
using Dapper;

public DataSet QueryMultiResultToDataSet(string sql, object param = null)
{
    DataSet dataSet = new DataSet();
    using (IDbConnection connection = new SqlConnection(_connectionString))
    {
        // 执行查询获取多结果集的IDataReader
        IDataReader dataReader = connection.ExecuteReader(sql, param);
        int tableIndex = 0;
        do
        {
            // 为每个结果集创建DataTable
            DataTable dataTable = new DataTable();
            dataTable.TableName = $"Table{tableIndex}";
            // 加载当前结果集的数据
            dataTable.Load(dataReader);
            // 将DataTable添加到DataSet
            dataSet.Tables.Add(dataTable);
            tableIndex++;
        } while (!dataReader.IsClosed && !dataReader.NextResult());
    }
    return dataSet;
}

这里使用do-while循环遍历所有结果集,通过IDataReaderNextResult方法切换到下一个结果集,直到所有结果集都处理完成,每个结果集对应DataSet中的一个DataTable。

注意事项

  • 使用完成后及时释放IDataReader和数据库连接,避免资源泄露,上述示例中都通过using语句完成了自动释放。
  • 如果查询参数包含特殊字符或者需要防止SQL注入,一定要使用参数化查询,不要直接拼接SQL字符串,Dapper的参数化查询会自动处理参数转义。
  • 填充完成后如果需要操作DataSet中的数据,注意DataTable的列类型会和数据库返回的字段类型自动匹配,不需要手动做类型转换。

DapperDataSetADO.NET数据填充修改时间:2026-06-23 01:24:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。