Usar decimal con precisión específica como parámetros de salida con Dapper

c# dapper

Pregunta

Estoy evaluando Dapper como un reemplazo para el código personalizado y engorroso y hasta ahora todo fue muy bueno y prometedor. Pero esta mañana he tropezado con un problema con los parámetros dinámicos y no puedo encontrar una solución.

Un procedimiento almacenado calcula el saldo de la cuenta y el saldo disponible para un cliente que devuelve su resultado en dos parámetros de salida decimal. Estos decimales se declaran en el procedimiento almacenado con Precisión = 18 y Escala = 2. Este procedimiento funciona perfectamente con los métodos estándar actuales. Pero en Dapper no puedo encontrar una forma de pasar estos parámetros y especificar la escala, así que todo lo que recupero es la parte entera del valor decimal.

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");
}

¿Y aquí está la pregunta (s), hay una manera de pasar la escala de un parámetro de salida decimal? ¿O hay una manera diferente de lograr mi objetivo de recuperar los valores decimales exactos?

Respuesta aceptada

Bueno, parece que no hay forma de resolver este problema (al menos ninguno ha encontrado una respuesta tentativa), así que puse esta solución que he implementado para continuar con el resto del trabajo.

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");

He pasado los parámetros de salida como Single lugar del tipo esperado Decimal .
De esta forma, supongo que la propiedad SqlParameter.Scale está configurada en algo diferente de cero y podría obtener los dígitos decimales cuando intento leer los parámetros de salida.
Si alguien tiene una mejor solución, házmelo saber.


Respuesta popular

Un poco tarde para la fiesta, pero pensé que mencionaría que esto se arregló en 2015. Aquí está el problema de GitHub. Ejemplo de uso:

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);
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow