2011-06-11 3 views
57

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

내 경우 첫 번째 결과 집합은 단일 열이있는 단일 행입니다. 0이면 호출이 성공했으며 두 번째 결과 집합에는 해당 실제 행/데이터 열이 포함됩니다. (0이 아닌 경우 오류가 발생하고 두 번째 결과 집합이 제공되지 않음)

Dapper.NET에서이 문제를 처리 할 수 ​​있습니까? 지금까지 단 하나의 0만을 얻었습니다.

업데이트 : 확인 : 결과가 올바르게 설정되어 있으면 정상적으로 작동합니다.

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

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

지금, 나는 또 다른 요구 사항이 : 2는 하나의 엔티티입니다.

두 번째 결과 집합에 대한 Dapper의 다중 매핑 (SQL Server에서 두 개의 개별 엔터티로 반환 된 단일 행 분할)이 아직 지원되지 않는 것 같습니다 (적어도 과부하가없는 것 같습니다. 다중 매핑을 처리 할 수있는 .Read<T>).

어떻게 그 행을 두 엔티티로 나눌 수 있습니까?

답변

58

QueryMultiple 메서드를 사용해 보셨습니까? 그것은해야 말한다 :

+6

이 대답은 예 이상의 세부 사항에 대한 링크 혜택을 누릴 것입니다. –

94

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

향후 독자 참고 사항 : QueryMultiple은 Oracle을 지원하지 않으며 오히려 Oracle은 QueryMultiple을 지원하지 않습니다. http://stackoverflow.com/questions/1062569/batch-multiple-select-statements-when-calling-oracle-from-ado-net/1064692#1064692 –

+10

오라클 사용에 대한 고집을 참조하십시오. –

+2

대단합니다! 이것에 대해주의해야 할 사항이 있습니까? 또한 한 번의 왕복으로 검색되는 데이터입니까? – scgough

5

여러 결과 집합을. (오라클은 보안상의 이유로 다중 질의를하지 않는다고 생각합니다.)

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 
+1

Oracle은 QueryMultiple 또는 QueryMultipleAsync를 지원합니다. –

관련 문제