[sql-server] Dapper.NET 및 여러 결과 세트가있는 저장된 proc

여러 결과 집합을 반환하는 저장된 procs와 함께 Dapper.NET을 사용하는 방법이 있습니까?

필자의 경우 첫 번째 결과 집합은 단일 열이있는 단일 행입니다. 그렇다면 0호출이 성공했으며 두 번째 결과 집합에는 실제 데이터 행 / 열이 포함됩니다. (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>처리 할 수 있는 오버로드가없는 것 같습니다. 다중 매핑).

해당 행을 두 개의 항목으로 분할하려면 어떻게해야합니까?



답변

QueryMultiple방법 을 시도해 보셨습니까 ? 다음과 같이 표시되어야합니다.

여러 결과 집합을 반환하는 명령을 실행하고 차례로 각각에 액세스합니다.

QueryMultiple을 활성화하려면이 using 문을 추가해야합니다.

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


답변

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

QueryMultiple을 활성화하려면이 using 문을 추가해야합니다.

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


답변

여러 결과 집합.

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

QueryMultiple을 활성화하려면이 using 문을 추가해야합니다.

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

저장 프로 시저 :

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


답변