web-dev-qa-db-fra.com

Dapper.NET et proc stocké avec plusieurs jeux de résultats

Existe-t-il un moyen d'utiliser Dapper.NET avec des proc stockés qui retournent plusieurs jeux de résultats?

Dans mon cas, le premier jeu de résultats est une seule ligne avec une seule colonne; si c'est 0 alors l'appel a réussi, et le deuxième jeu de résultats contiendra les lignes/colonnes de données réelles. (et s'il était différent de zéro, une erreur s'est produite et aucun deuxième jeu de résultats ne sera fourni)

Une chance de gérer cela avec Dapper.NET? Jusqu'à présent, je ne récupère que ce single 0 - mais rien de plus.

Mise à jour: OK, cela fonctionne bien - tant que le jeu de résultats n °. 2 est une entité unique:

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

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

Maintenant, j'ai encore une autre exigence.

Le mappage multiple de Dapper (fractionnement d'une seule ligne renvoyée par SQL Server en deux entités distinctes) pour ce deuxième jeu de résultats ne semble pas encore pris en charge (au moins il ne semble pas y avoir de surcharge de .Read<T> qui peut gérer le mappage multiple).

Comment puis-je diviser cette ligne en deux entités?

73
marc_s

Avez-vous essayé la méthode QueryMultiple? Il dit qu'il devrait:

Exécutez une commande qui renvoie plusieurs jeux de résultats et accédez à chacun à son tour

Vous devrez ajouter cette instruction using pour activer 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); */
67
Andomar

QueryMultiple prend en charge la possibilité de gérer plusieurs jeux de résultats. La seule restriction de conception que nous avons ajoutée était la désactivation totale de la mise en mémoire tampon pour le lecteur de grille. Cela signifie que l'API entière est streaming.

Dans le cas le plus simple, vous pouvez utiliser:

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

Dans le cas légèrement plus sophistiqué, vous pouvez faire des choses folles comme ceci:

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

Vous devrez ajouter cette instruction using pour activer 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); */
114
Sam Saffron

Ensemble de résultats multiples.

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

Vous devrez ajouter cette instruction using pour activer 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); */

Procédure stockée:

CREATE PROCEDURE [dbo].[ProductSearch]
    @CategoryID as varchar(20),
    @SubCategoryID as varchar(20),
    @PageNumber as varchar(20)
AS
BEGIN
    SELECT * FROM ProductTbl
    SELECT * FROM ProductTbl
END
13
Arun Prasad E S