c# – 使用具有特定精度的十进制作为Dapper的输出参数

我正在评估Dapper作为自定义和繁琐代码的替代品,到目前为止,所有这些都是非常好的和有前途的.但今天早上我偶然发现了动态参数的问题,无法找到解决方案.

存储过程为客户计算帐户余额和可用余额,以两个十进制输出参数返回其结果.这些小数在存储过程中声明,其中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");
}

这里有一个问题,有一种方法可以传递十进制输出参数的比例吗?或者有一种不同的方法来实现我的目标,以获取确切的小数值?

最佳答案 好吧,似乎没有办法解决这个问题(至少没有人找到一个试探性的答案)所以我把这个已经实施的解决方法继续进行其余的工作.

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

我已将输出参数传递为Single而不是期望的Decimal类型.
这样,我想SqlParameter.Scale属性被设置为不同于零的东西,当我尝试读取输出参数时,我可以得到小数位数.
如果有人有更好的解决方案,请告诉我.

点赞