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

dapper multiple-resultsets sql-server stored-procedures

Question

Est-il possible d'utiliser Dapper.NET avec des procédures stockées qui renvoient plusieurs jeux de résultats?

Dans mon cas, le premier ensemble de résultats est une seule ligne avec une seule colonne; Si c'est 0 l'appel a réussi et le deuxième jeu de résultats contiendra ces lignes / colonnes de données. (et si elle était non nulle, une erreur est survenue et aucun deuxième ensemble de résultats ne sera fourni)

Une chance de gérer cela avec Dapper.NET? Jusqu'à présent, je ne reviens que ce seul 0 - mais rien de plus.

Mise à jour: OK, ça marche bien - tant que le résultat n'est pas défini. 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 multi-mapping de Dapper (divisant une seule ligne renvoyée par SQL Server en deux entités distinctes) pour ce second jeu de résultats ne semble pas encore être pris en charge (au moins, il ne semble pas y avoir de surcharge de .Read<T> qui peut gérer le multi-mapping).

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

Réponse acceptée

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 d'eux à tour de rôle


Réponse populaire

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 toute l'API est en 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 un peu 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);



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi