跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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

Dapper不支持返回DataSet,因其设计聚焦于高效SQL执行与强类型对象映射,刻意省略DataAdapter/DataSet等重量级抽象;可通过复用IDbConnection配合原生DataAdapter.Fill()实现,或封装扩展方法桥接,但推荐优先使用Query或GridReader等现代方式。 Dapper 本身不直接支持返回
DataSet
,因为它是一个轻量级 ORM,专注于快速执行 SQL 并映射到强类型对象(如
List
或单个实体),而不是 ADO.NET 的传统数据容器(如
DataSet
、
DataTable
)。 为什么 Dapper 不提供 FillDataSet 方法 Dapper 的设计哲学是“只做一件事,并把它做好”——高效执行 SQL + 对象映射。它绕过了
DataAdapter
和
DataSet
这类较重的抽象层,因此没有内置的
FillDataSet()
或类似扩展方法。 如何用 Dapper 配合 ADO.NET 填充 DataSet 你可以手动使用 Dapper 获取
IDbConnection
,再结合原生 ADO.NET 的
DataAdapter.Fill()
来填充
DataSet
。关键点是:复用连接、避免重复打开/关闭。 确保连接已打开(Dapper 不自动管理连接状态,需自己控制) 用同一个连接创建
DataAdapter
(如
SqlDataAdapter
) 调用
Fill()
方法填充
DataSet
示例(SQL Server):
using (var connection = new SqlConnection(connectionString)) { connection.Open(); // 必须显式打开
var dataSet = new DataSet();
using (var adapter = new SqlDataAdapter("SELECT * FROM Users; SELECT * FROM Orders;", connection))
{
    adapter.Fill(dataSet); // 自动创建两个 DataTable
}

// dataSet.Tables[0] → Users  
// dataSet.Tables[1] → Orders
} 如果坚持用 Dapper 语法风格封装 FillDataSet 可以自己写一个简单扩展方法,把连接和 SQL 封装起来,让调用更接近“Dapper 风格”: Trae win Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。 下载
public static class DapperExtensions { public static DataSet FillDataSet(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null) { var ds = new DataSet(); var cmd = connection.CreateCommand(); cmd.CommandText = sql; cmd.CommandTimeout = commandTimeout ?? 30; if (transaction != null) cmd.Transaction = transaction;
    // 如果有参数,Dapper 处理动态参数(仅限 SqlClient 场景)
    if (param != null)
    {
        var dbParam = cmd.CreateParameter();
        // 实际中建议用 Dapper.SqlMapper.PackListParameters 或第三方适配逻辑
        // 此处简化:仅支持简单参数绑定,复杂场景仍推荐用 SqlCommandBuilder + SqlParameter
    }

    using (var adapter = new SqlDataAdapter((SqlCommand)cmd))
    {
        adapter.Fill(ds);
    }
    return ds;
}
} ⚠️ 注意:这个扩展仅适用于
SqlConnection
,且对参数化查询的支持有限;生产环境建议直接用原生
SqlDataAdapter
更可控。 更推荐的替代方案 除非遗留系统强制要求
DataSet
(比如 WinForms BindingSource、旧报表工具),否则建议转向现代方式: 用
connection.Query(sql)
返回
IEnumerable
多结果集用
GridReader
:
using var multi = connection.QueryMultiple(sql); var users = multi.Read(); var orders = multi.Read();
需要 DataTable?可用
connection.Query().AsTable()
(配合
System.Data.DataTableExtensions
或自定义扩展) 基本上就这些。Dapper 不填 DataSet 不是缺陷,而是取舍——要灵活性和性能,就绕过 DataSet;要兼容旧代码,就自己桥接 ADO.NET。

相关文章