5

我正在评估 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");
}

这是问题,有一种方法可以传递十进制输出参数的比例吗?或者有一种不同的方法可以实现我的目标,即取回精确的十进制值?

4

3 回答 3

3

聚会有点晚了,但我想我会提到这已在 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);
}
于 2018-02-09T17:25:39.813 回答
1

好吧,似乎没有办法解决这个问题(至少没有人找到一个暂定的答案)所以我把我已经实施的这个解决方法继续做剩下的工作。

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 属性设置为不同于零的值,当我尝试读取输出参数时,我可以获得小数位数。
如果有人有更好的解决方案,请告诉我。

于 2013-07-26T07:48:01.850 回答
0

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

于 2016-06-16T09:57:12.553 回答