Dapper.NET и сохраненный proc с несколькими результирующими наборами



есть ли способ использовать Dapper.NET с сохраненными процессорами, которые возвращают несколько результирующих наборов?



в моем случае первый результирующий набор-это одна строка с одним столбцом; если это 0 тогда вызов был успешным, и второй результирующий набор будет содержать эти фактические строки/столбцы данных. (и если он был ненулевым, произошла ошибка, и второй результирующий набор не будет предоставлен)



любой шанс справиться с этим Dapper.NET до сих пор, я только когда-нибудь получу обратно этот сингл 0 - но не более того.



обновление: хорошо, он отлично работает - пока результирующий набор № 2 является единым целым:



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

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


теперь у меня есть еще один требование.



мульти-сопоставление Dapper (разделение одной строки, возвращенной из SQL Server, на две отдельные сущности) для этого второго результирующего набора пока не поддерживается (по крайней мере, не похоже, что перегрузка .Read<T> что справлюсь мульти-отображение).



как я могу разделить эту строку на две сущности?

560   3  

3 ответов:

вы пробовали QueryMultiple способ? Он говорит, что должен:

выполнить команду, которая возвращает несколько результирующих наборов и доступ к каждому в свою очередь

QueryMultiple поддерживает возможность работы с несколькими результирующими наборами. Единственное ограничение дизайна, которое мы добавили, было полностью отключить буферизацию для чтения сетки. Это означает, что весь API является потокового.

В простейшем случае вы можете использовать:

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

В немного более сложном случае вы можете делать сумасшедшие вещи, как это:

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

несколько результирующих наборов.

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

хранимая процедура:

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

Comments

    Ничего не найдено.