sql-server - Dapper.NET 和具有多个结果集的存储过程

标签 sql-server stored-procedures dapper multiple-resultsets

有没有办法将 Dapper.NET 与返回多个结果集的存储过程一起使用?

就我而言,第一个结果集是单行单列;如果是0那么调用成功,第二个结果集将包含实际的数据行/列。 (如果它非零,则会发生错误并且不会提供第二个结果集)

有机会用 Dapper.NET 来处理这个问题吗?到目前为止,我只找回了那首单曲 0 - 但仅此而已。

更新:好的,它工作正常 - 只要结果集没有。 2 是单个实体:

Dapper.SqlMapper.GridReader reader = 
    _conn.QueryMultiple("sprocname", dynParams, 
    commandType: CommandType.StoredProcedure);

int status = reader.Read<int>().FirstOrDefault();
MyEntityType resultObj = reader.Read<MyEntityType>().FirstOrDefault();

现在,我还有另一个要求。

到目前为止,第二个结果集的 Dapper 多重映射(将从 SQL Server 返回的单行拆分为两个单独的实体)似乎尚未得到支持(至少似乎没有出现过载) .Read<T> 可以处理多重映射)。

如何将该行拆分为两个实体?

最佳答案

QueryMultiple 支持处理多个结果集的能力。我们添加的唯一设计限制是完全禁用网格读取器的缓冲。这意味着整个 API 都是流式

在最简单的情况下,您可以使用:

var grid = connection.QueryMultiple("select 1 select 2");
grid.Read<int>().First().IsEqualTo(1);
grid.Read<int>().First().IsEqualTo(2);

在稍微复杂一点的情况下,你可以做这样疯狂的事情:

var p = new DynamicParameters();
p.Add("a", 11);
p.Add("r", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

connection.Execute(@"create proc #spEcho
@a int
as 
begin

select @a Id, 'ping' Name, 1 Id, 'pong1' Name
select @a Id, 'ping' Name, 2 Id, 'pong2' Name
return @a
end");

var grid = connection.QueryMultiple("#spEcho", p, 
                                     commandType: CommandType.StoredProcedure);

var result1 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
                  (a, b) => Tuple.Create((object)a, (object)b)).ToList();
var result2 = grid.Read<dynamic, dynamic, Tuple<dynamic, dynamic>>(
                  (a, b) => Tuple.Create((object)a, (object)b)).ToList();

((int)(result1[0].Item1.Id)).IsEqualTo(11);
((int)(result1[0].Item2.Id)).IsEqualTo(1);

((int)(result2[0].Item1.Id)).IsEqualTo(11);
((int)(result2[0].Item2.Id)).IsEqualTo(2);

p.Get<int>("r").IsEqualTo(11);

您需要添加此 using 语句才能启用 QueryMultiple 。

using Dapper; /* to add extended method QueryMultiple public static GridReader QueryMultiple(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null); */

关于sql-server - Dapper.NET 和具有多个结果集的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317937/

相关文章:

mysql - 过滤 SQL 表以根据 "invoice_status"显示总计

c# - 如何使用 Colllection.ToDictionary() 将 Dictionary<dynamic, dynamic> 转换为 Dictionary<string, string>

sql - TSQL 随机选择与选择标准

sql - 按最新 LastModifiedDatetime 排序的前 30 条不同记录

postgresql - postgresql中的自定义自增字段(发票/订单号)

node.js - 在node js中使用node-oracledb将对象作为输入参数传递给存储过程

sql-server - SQL Server 中的 SPID 和连接之间有什么关系?

sql-server - SQL更新触发期间的预期结果表是什么?

c# - 将表作为输入参数传递给 .NET Core 中的 Dapper

c# - 如何将 ormlite 与 SQL Server 和 Mars 一起使用?