[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