Dapper.NET和存儲過程具有多個結果集

dapper multiple-resultsets sql-server stored-procedures

有沒有辦法使用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>的重載.Read<T>可以處理多映射)。

如何將該行拆分為兩個實體?

一般承認的答案

你嘗試過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); */

熱門答案

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


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因