Dapper.NET 및 여러 결과 세트가있는 저장된 proc


80

여러 결과 집합을 반환하는 저장된 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>처리 할 수 있는 오버로드가없는 것 같습니다. 다중 매핑).

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


직렬화 후 dotnet 코드에서 별도의 결과 집합을 병합하거나 "함께 연결"해야하는 경우 여기에 훌륭한 도우미 메서드가 있습니다. stackoverflow.com/questions/6379155/...
granadaCoder

답변:


69

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

27
이 답변은 예제 또는 자세한 내용이 포함 된 링크를 통해 도움이 될 것입니다.
Trevor.Screws 2011

126

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

23
향후 독자를위한 참고 사항 : QueryMultiple은 Oracle을 지원하지 않거나 오히려 Oracle이 QueryMultiple을 지원하지 않습니다. 참조 stackoverflow.com/questions/1062569/...
찰스 번스

21
Oracle 사용을 고수하기위한 노력.
Pure.Krome

2
이것은 훌륭합니다! 이것에 대해주의해야 할 사항이 있습니까? 또한 데이터가 1 ​​회 왕복으로 검색됩니까?
scgough

멀티 리더에서 병렬로 읽을 수 있도록 멀티 스레딩을 지원합니까?
barakcaf

이 작업을 수행하려면 MultipleActiveResultSets를 활성화해야합니까? 또는? 어쩌면 나는 MultipleActiveResultSets가 무엇에 사용되는지 이해하지
못할 수도 있습니다.

24

여러 결과 집합.

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

1
오라클은 QueryMultiple 또는 QueryMultipleAsync를 지원합니다
Umar Topia

1
그러나 매핑 할 범주를 어떻게 알 수 있습니까? 처음으로 Read를 호출 할 때 반환 된 첫 번째 결과 집합에서 가져 오나요?
WhiteleyJ

1
@Yojin 예, 각각
Arun Prasad ES

1
별도의 컬렉션을 "병합"하거나 "연결"해야하는 경우 여기에 훌륭한 도우미 방법이 있습니다. stackoverflow.com/questions/6379155/...
granadaCoder

포함 여부에 따라 변경되는 사항은 무엇입니까 .ToList()? 귀하와 @Sam Saffron 모두 귀하의 코드 샘플에서이 작업을 수행 한 것을 확인했습니다. 왕복 횟수 또는 반환되는 데이터 양에 영향을 미칩니 까?
mft25
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.