Dapper.Net의 저장 프로 시저에서 플랫 레코드 세트를 다시 얻는 방법

dapper sql-server-2005 stored-procedures

문제

SQL Server 2005에서 실행되는 프로젝트가 있습니다. 일부 입력 매개 변수를 받아들이고 2 개의 출력 매개 변수를 가지며 내부의 select 문에서 결과 집합을 반환하는 저장 프로 시저가 있습니다.

데이터는 기본 키가없는 단순한 dto 클래스 'Foo'만 개체로 반환 될 의도가 없습니다.

아래 코드와 함께 Dapper.Net을 사용하려고 시도했지만 예외가 반환 된 경우 오류가 발생합니다.

다중 매핑 API를 사용할 때 ID가 아닌 키가 있으면 splitOn 매개 변수를 설정해야합니다.

암호:

var p = new DynamicParameters();
p.Add("@Code", code);
p.Add("@MessageControlId", getMessageControlId);
p.Add("@SuccessCode", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@ErrorDescription", dbType: DbType.String, direction: ParameterDirection.Output, size: 255);

var result = this.db.Query(sql: "up_MessageProcessed_get", param: p, commandType: CommandType.StoredProcedure);

Dapper.Net에서이 작업을 수행 할 수 있어야합니까? 간단한 결과를 얻기 위해 다른 것을 호출해야합니까?

요청에 따라 여기에 프로 시저의 셸이 있으며 반환 값을 설정하고 1 개의 결과 집합을 반환합니다.

CREATE PROCEDURE [dbo].[up_MessageProcessed_get]
@Code varchar(10),
@MessageControlID varchar(22),
@SuccessCode int OUTPUT,
@ErrorDescription varchar(255) OUTPUT
AS

BEGIN

Select 2 as MessageProcessID, 38349348 as StartNum, 3874900 as EndNum, GETDATE() as StartDate, GETDATE() as EndDate
SET @SuccessCode = 0
SET @ErrorDescription = 'Completed successfully'
END

수락 된 답변

이것은 "더 많은 컨텍스트가 필요합니다"라고하는 것보다 "대답"이 많지는 않지만 게시 된 코드는 제대로 작동합니다 (아래). 나는 여기에있는 문제가 스토어드 프로 시저 내부의 무언가와 관련이 있다고 의심한다.

public void TestIssue17648290()
{
    var p = new DynamicParameters();
    int code = 1, getMessageControlId = 2;
    p.Add("@Code", code);
    p.Add("@MessageControlId", getMessageControlId);
    p.Add("@SuccessCode", dbType: DbType.Int32, direction: ParameterDirection.Output);
    p.Add("@ErrorDescription", dbType: DbType.String, direction: ParameterDirection.Output, size: 255);
    connection.Execute(@"CREATE PROCEDURE #up_MessageProcessed_get
@Code varchar(10),
@MessageControlID varchar(22),
@SuccessCode int OUTPUT,
@ErrorDescription varchar(255) OUTPUT
AS

BEGIN

Select 2 as MessageProcessID, 38349348 as StartNum, 3874900 as EndNum, GETDATE() as StartDate, GETDATE() as EndDate
SET @SuccessCode = 0
SET @ErrorDescription = 'Completed successfully'
END");
    var result = connection.Query(sql: "#up_MessageProcessed_get", param: p, commandType: CommandType.StoredProcedure);
    var row = result.Single();
    ((int)row.MessageProcessID).IsEqualTo(2);
    ((int)row.StartNum).IsEqualTo(38349348);
    ((int)row.EndNum).IsEqualTo(3874900);
    DateTime startDate = row.StartDate, endDate = row.EndDate;
    p.Get<int>("SuccessCode").IsEqualTo(0);
    p.Get<string>("ErrorDescription").IsEqualTo("Completed successfully");
}

출력 :

Running TestIssue17648290 - OK!

(즉 : 그것은 잘 작동합니다)



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