Dapper.NET und Stored Proc mit mehreren Ergebnismengen

dapper multiple-resultsets sql-server stored-procedures

Frage

Gibt es eine Möglichkeit, Dapper.NET mit gespeicherten Prozeduren zu verwenden, die mehrere Ergebnismengen zurückgeben?

In meinem Fall ist die erste Ergebnismenge eine einzelne Zeile mit einer einzelnen Spalte; Wenn es 0 ist, war der Aufruf erfolgreich und die zweite Ergebnismenge enthält die tatsächlichen Zeilen / Spalten der Daten. (und wenn es nicht Null war, ist ein Fehler aufgetreten und es wird keine zweite Ergebnismenge bereitgestellt)

Eine Chance, das mit Dapper.NET zu bewältigen? Bis jetzt bekomme ich immer nur diese einzige 0 - aber nichts mehr.

Update: OK, es funktioniert gut - solange das Ergebnis nicht gesetzt ist. 2 ist eine einzige Einheit:

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

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

Jetzt habe ich noch eine weitere Anforderung.

Dappers Multi-Mapping (Aufteilen einer einzelnen Zeile, die von SQL Server in zwei separate Entitäten zurückgegeben wurde) für diese zweite Ergebnismenge scheint noch nicht unterstützt zu werden (zumindest scheint es keine Überlastung von .Read<T> das Multi-Mapping verarbeiten kann).

Wie kann ich diese Zeile in zwei Entitäten aufteilen?

Akzeptierte Antwort

Haben Sie die QueryMultiple Methode QueryMultiple ? Es sagt, es sollte:

Führen Sie einen Befehl aus, der mehrere Ergebnismengen zurückgibt, und greifen Sie nacheinander auf diese zu

Sie müssen diese using-Anweisung hinzufügen, um QueryMultiple zu aktivieren.

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

Beliebte Antwort

QueryMultiple unterstützt die Möglichkeit, mit mehreren Ergebnissätzen umzugehen. Die einzige Design-Einschränkung, die wir hinzugefügt haben, war die vollständige Deaktivierung der Pufferung für den Grid-Reader. Dies bedeutet, dass die gesamte API gestreamt wird .

Im einfachsten Fall können Sie verwenden:

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

In dem etwas anspruchsvolleren Fall können Sie verrückte Sachen wie folgt machen:

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

Sie müssen diese using-Anweisung hinzufügen, um QueryMultiple zu aktivieren.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum