Dapper에서 특정 정밀도의 소수를 출력 매개 변수로 사용

c# dapper

문제

Dapper를 커스텀 코드와 성가신 코드로 대체 할 것이라고 평가하고 있으며, 지금까지는 모두 매우 훌륭하고 유망했습니다. 그러나 오늘 아침 나는 동적 매개 변수에 문제가 발생하여 해결책을 찾을 수 없습니다.

저장 프로시 저는 두 개의 10 진수 출력 매개 변수로 결과를 반환하는 고객에 대한 계정 잔액 및 사용 가능한 잔액을 계산합니다. 이러한 소수는 Precision = 18 및 Scale = 2 인 저장 프로 시저에서 선언됩니다. 이 절차는 현재 표준 방법과 완벽하게 작동합니다. 그러나 Dapper에서 이러한 매개 변수를 전달하고 소수 자릿수를 지정하는 방법을 찾을 수 없으므로 반환 할 모든 것이 소수 값의 정수 부분입니다.

using (IDbConnection connection = OpenConnection())
{
    var args = new DynamicParameters(new { custID = customerID});

    // No way to set the scale here?
    args.Add("@accnt", dbType: DbType.Decimal, direction: ParameterDirection.Output);
    args.Add("@avail", dbType: DbType.Decimal, direction: ParameterDirection.Output);

    var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
    decimal account = args.Get<decimal>("@accnt");
    decimal availab = args.Get<decimal>("@avail");
}

그리고 여기에 질문이 있습니다. 십진법 출력 매개 변수의 크기를 전달하는 방법이 있습니까? 아니면 정확히 10 진수 값을 되 찾으려는 목표를 달성하는 다른 방법이 있습니까?

수락 된 답변

글쎄,이 문제를 해결할 수있는 방법이 없다 (적어도 아무도 임시 응답을 찾지 못했음). 그래서이 해결 방법을 적용하여 나머지 작업을 계속 수행하도록 구현했습니다.

var args = new DynamicParameters(new { custID = customerID});
args.Add("@accnt", dbType: DbType.Single, direction: ParameterDirection.Output);
args.Add("@avail", dbType: DbType.Single, direction: ParameterDirection.Output);

var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
decimal account = args.Get<decimal>("@accnt");
decimal availab = args.Get<decimal>("@avail");

예상되는 형식 Decimal 대신 Single 로 출력 매개 변수를 전달했습니다.
이 방법에서는 SqlParameter.Scale 속성이 0이 아닌 다른 값으로 설정되고 출력 매개 변수를 읽으려고 할 때 십진수 숫자를 얻을 수 있다고 가정합니다.
누군가가 더 나은 해결책을 알고 있다면 알려주세요.


인기 답변

파티가 좀 늦었지만 2015 년에이 문제가 수정되었다고 언급했습니다. 여기 GitHub 문제가 있습니다. 사용 예 :

public void Issue261_Decimals()
{
    var parameters = new DynamicParameters();
    parameters.Add("c", dbType: DbType.Decimal, direction: ParameterDirection.Output, precision: 10, scale: 5);
    connection.Execute("create proc #Issue261 @c decimal(10,5) OUTPUT as begin set @c=11.884 end");
    connection.Execute("#Issue261", parameters, commandType: CommandType.StoredProcedure);
    var c = parameters.Get<Decimal>("c");
    c.IsEqualTo(11.884M);
}


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