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

dapper multiple-resultsets sql-server stored-procedures

문제

Dapper.NET을 사용하여 여러 결과 집합을 반환하는 저장된 procs를 사용할 수 있습니까?

필자의 경우 첫 번째 결과 집합은 단일 열이있는 단일 행입니다. 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 은 여러 결과 세트를 처리하는 기능을 지원합니다. 우리가 추가 한 유일한 설계 제한은 그리드 리더에 대한 버퍼링을 완전히 불가능하게하는 것이 었습니다. 즉 전체 API가 스트리밍 중임을 의미합니다.

가장 간단한 경우 다음을 사용할 수 있습니다.

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.