使用具有特定精度的十进制作为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("@accnt"); decimal availab = args.Get("@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("@accnt"); decimal availab = args.Get("@avail"); 

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

派对有点晚了,但我想我会提到这是在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("c"); c.IsEqualTo(11.884M); } 

我遇到过同样的问题。 我更改了我的USP或查询以传递varhcar(10)并将varchar(10)分配给十进制值并成功!