source

Dapper.NET 및 저장된 proc(여러 결과 세트 포함)

ittop 2023. 5. 7. 11:49
반응형

Dapper.NET 및 저장된 proc(여러 결과 세트 포함)

대퍼를 사용할 수 있는 방법이 있습니까?여러 결과 세트를 반환하는 저장된 프로시저가 있는 NET?

이 경우 첫 번째 결과 집합은 단일 열이 있는 단일 행입니다.0그러면 호출이 성공적으로 완료되고 두 번째 결과 집합에는 해당 데이터의 실제 행/테이블이 포함됩니다. (그리고 0이 아닐 경우 오류가 발생하여 두 번째 결과 집합이 제공되지 않습니다.)

대퍼와 함께 이 일을 처리할 수 있는 기회.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에서는 여러 결과 집합을 처리하는 기능을 지원합니다.우리가 추가한 유일한 설계 제한 사항은 그리드 리더의 버퍼링을 완전히 비활성화하는 것이었습니다.이것은 전체 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 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방법?다음과 같이 표시됩니다.

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

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

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 }, commandType: CommandType.StoredProcedure);
var ProductListOne = reader.Read<ProuductTbl>().ToList();
var ProductListTwo = reader.Read<ProuductTbl>().ToList();

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

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 int
AS
BEGIN
    SELECT * FROM ProductTbl
    SELECT * FROM ProductTbl
END

언급URL : https://stackoverflow.com/questions/6317937/dapper-net-and-stored-proc-with-multiple-result-sets

반응형