为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

哆啦的时光机 2019-11-14 15:37:46

有什么方法可以将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>可以处理的重载)多重映射)。


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


查看完整描述

3 回答

?
慕森王

您是否尝试过该QueryMultiple方法?它说应该:


执行一个返回多个结果集的命令,并依次访问每个结果集


您需要添加此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); */


查看完整回答
反对 回复 2019-11-14
?
尚方宝剑之说

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); */


查看完整回答
反对 回复 2019-11-14
?
茅侃侃

多个结果集。


var reader = conn.QueryMultiple("ProductSearch", param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, commandType: CommandType.StoredProcedure);

var CategoryOneList = reader.Read<CategoryOne>().ToList();

var CategoryTwoList = reader.Read<CategoryTwo>().ToList();

您需要添加此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); */

存储过程:


CREATE PROCEDURE [dbo].[ProductSearch]

    @CategoryID as varchar(20),

    @SubCategoryID as varchar(20),

    @PageNumber as varchar(20)

AS

BEGIN

    SELECT * FROM ProductTbl

    SELECT * FROM ProductTbl


查看完整回答
反对 回复 2019-11-14
  • 3 回答
  • 0 关注
  • 47 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信