Dapper.NET y el proceso almacenado con múltiples conjuntos de resultados

dapper multiple-resultsets sql-server stored-procedures

Pregunta

¿Hay alguna forma de usar Dapper.NET con procs almacenados que devuelven múltiples conjuntos de resultados?

En mi caso, el primer conjunto de resultados es una sola fila con una sola columna; si es 0 , la llamada fue exitosa y el segundo conjunto de resultados contendrá las filas / columnas de datos reales. (y si no era cero, se produjo un error y no se proporcionará un segundo conjunto de resultados)

¿Alguna posibilidad de manejar esto con Dapper.NET? Hasta ahora, solo vuelvo a obtener ese 0 solo, pero nada más.

Actualización: OK, funciona bien, siempre que el resultado sea no. 2 es una entidad única:

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

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

Ahora, tengo otro requisito.

El mapeo múltiple de Dapper (dividir una sola fila devuelta desde SQL Server en dos entidades separadas) para ese segundo conjunto de resultados no parece ser compatible hasta el momento (al menos no parece haber una sobrecarga de .Read<T> que puede manejar multi-mapping).

¿Cómo puedo dividir esa fila en dos entidades?

Respuesta aceptada

¿Has probado el método QueryMultiple ? Dice que debería:

Ejecute un comando que devuelva varios conjuntos de resultados y acceda a cada uno de ellos

Tendrá que agregar esta instrucción de uso para habilitar el múltiplo de consulta.

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

Respuesta popular

QueryMultiple admite la capacidad de tratar con múltiples conjuntos de resultados. La única restricción de diseño que agregamos fue la desactivación total del búfer para el lector de cuadrícula. Esto significa que toda la API está transmitiendo .

En el caso más sencillo puedes usar:

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

En el caso un poco más sofisticado puedes hacer locuras como esta:

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

Tendrá que agregar esta instrucción de uso para habilitar el múltiplo de consulta.

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué