Frage

Gibt es eine Möglichkeit, dapper.net mit gespeicherten Procs zu verwenden, die mehrere Ergebnissätze zurückgeben?

In meinem Fall ist das erste Ergebnissatz eine einzelne Zeile mit einer einzelnen Spalte. wenn es 0 Dann war der Anruf erfolgreich und das zweite Ergebnissatz enthält die tatsächlichen Zeilen/Datenspalten. (Und wenn es sich um ungleich Null handelte, wurde ein Fehler aufgetreten und es wird kein zweites Ergebnissatz bereitgestellt.)

Gibt es eine Chance, dies mit dapper.net zu bewältigen? Bisher komme ich immer nur diese Single zurück 0 - Aber nichts weiter.

Aktualisieren: Ok, es funktioniert einwandfrei - solange das Ergebnis Nr. Nr. 2 ist eine einzelne 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 ein anderer Erfordernis.

Dappers Multi-Mapping (Aufteilung einer einzelnen Zeile, die von SQL Server in zwei separate Entitäten zurückgegeben wird), scheint noch nicht unterstützt zu werden (zumindest scheint es keine Überlastung von zu geben .Read<T> Das kann Multi-Mapping verarbeiten).

Wie kann ich diese Reihe in zwei Entitäten aufgeteilt?

War es hilfreich?

Lösung

Hast du das ausprobiert QueryMultiple Methode? Es heißt es: es sollte:

Führen Sie einen Befehl aus, der mehrere Ergebnissätze zurücksetzt

Sie müssen diese mit 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); */

Andere Tipps

QueryMultiple Unterstützt die Fähigkeit, mit mehreren Ergebnissätzen umzugehen. Die einzige Designbeschränkung, die wir hinzugefügt haben, war die vollständige Deaktivierung der Pufferung für den Rasterleser. Dies bedeutet, dass die ganze API ist Streaming.

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 solche verrückten Sachen 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 mit 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); */

Mehrfachergebnisse.

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

Sie müssen diese mit 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); */

Gespeicherte Prozedur:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top