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

18次阅读

Dapper不支持返回DataSet,因其设计聚焦于高效sql执行与强类型对象映射,刻意省略DataAdapter/DataSet等重量级抽象;可通过复用IDbConnection配合原生DataAdapter.Fill()实现,或封装扩展方法桥接,但推荐优先使用Query或GridReader等现代方式。

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

Dapper 本身不直接支持返回 DataSet,因为它是一个轻量级 ORM,专注于快速执行 SQL 并映射到强类型对象(如 List<t></t> 或单个实体),而不是 ADO.net 的传统数据容器(如 DataSetDataTable)。

为什么 Dapper 不提供 FillDataSet 方法

Dapper 的设计哲学是“只做一件事,并把它做好”——高效执行 SQL + 对象映射。它绕过了 DataAdapterDataSet 这类较重的抽象层,因此没有内置的 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(); // 必须显式打开 <pre class="brush:php;toolbar:false;">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 风格”:

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

Opus

AI生成视频工具

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

查看详情 Dapper怎么返回一个DataSet Dapper填充DataSet方法

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; <pre class="brush:php;toolbar:false;">    // 如果有参数,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<user>(sql)</user> 返回 IEnumerable<user></user>
  • 多结果集用 GridReaderusing var multi = connection.QueryMultiple(sql); var users = multi.Read<user>(); var orders = multi.Read<order>();</order></user>
  • 需要 DataTable?可用 connection.Query<t>().AsTable()</t>(配合 System.Data.DataTableExtensions 或自定义扩展)

基本上就这些。Dapper 不填 DataSet 不是缺陷,而是取舍——要灵活性和性能,就绕过 DataSet;要兼容旧代码,就自己桥接 ADO.NET。

text=ZqhQzanResources