Dapper.NET e stored proc con più set di risultati

dapper multiple-resultsets sql-server stored-procedures

Domanda

C'è un modo per usare Dapper.NET con stored procs che restituiscono più set di risultati?

Nel mio caso, il primo set di risultati è una singola riga con una singola colonna; se è 0 la chiamata ha avuto esito positivo e il secondo set di risultati conterrà le righe / colonne effettive dei dati. (e se era diverso da zero, si è verificato un errore e non verrà fornito un secondo set di risultati)

Qualche possibilità di gestirlo con Dapper.NET? Finora, sono sempre tornato indietro nel singolo 0 - ma niente di più.

Aggiornamento: OK, funziona bene - fino a quando il risultato impostato no. 2 è una singola entità:

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

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

Ora, ho ancora un altro requisito.

Il multi-mapping di Dapper (dividendo una singola riga restituita da SQL Server in due entità separate) per quel secondo set di risultati non sembra essere ancora supportato (almeno non sembra esserci un sovraccarico di .Read<T> che può gestire la multi-mappatura).

Come posso dividere quella riga in due entità?

Risposta accettata

Hai provato il metodo QueryMultiple ? Dice che dovrebbe:

Esegui un comando che restituisce più set di risultati e accedi ciascuno a turno

Dovrai aggiungere questa istruzione usando per abilitare 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); */

Risposta popolare

QueryMultiple supporta la capacità di gestire più set di risultati. L'unica restrizione di progettazione che abbiamo aggiunto è stata la disabilitazione totale del buffering per il Grid Reader. Ciò significa che l'intera API è in streaming .

Nel caso più semplice puoi usare:

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

Nel caso leggermente più sofisticato puoi fare cose pazzesche come questa:

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

Dovrai aggiungere questa istruzione usando per abilitare 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); */


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché