未从SQL存储过程返回的小数位

时间:2017-04-13 19:22:56

标签: c# asp.net-mvc-5

场合

正如问题所说,我有一个程序,在输入一个值后,这个值被发送到我的商店程序,80和20%被计算并通过out参数返回。

问题

问题是,尽管我认为我的代码应该正常工作,但在计算80%和20%时,小数位不会被返回。我查看了代码并在SQL管理器中运行代码正常工作,我只是无法将正确的值输入到我的C#应用​​程序中。

C#代码

        decimal fl_covByA;
        decimal fl_covByB;
        using (Bookstore_DBEntities x = new Bookstore_DBEntities())
        {


            ObjectParameter covByIndiv = new ObjectParameter("covByIndiv", typeof(decimal));
            ObjectParameter covByIns = new ObjectParameter("covByIns", typeof(decimal)); 
            x.cal_InsCoverage(cla_bookDetails.cost,covByIndiv, covByIns); //Breakpoint shows values without decimals
            fl_covByB = (decimal)covByIndiv.Value;
            fl_covByA = (decimal)covByIns.Value;
        }

存储过程

CREATE PROCEDURE [dbo].[cal_InsCoverage]
@cost numeric(18,2),
@covByIndiv numeric(18,2) OUT,
@covByIns numeric(18,2) OUT
AS
SELECT @covByIndiv=(@cost*20)/100,@covByIns=(@cost*80)/100
GO

如果我通过100.25的成本,我的查询结果中得到20.05 80.20,但根据我的断点,我得到20和80.所以任何帮助将不胜感激。

的问候。

5 个答案:

答案 0 :(得分:1)

每当您将十进制参数传递给SQL Server存储过程时,您必须设置参数的精度和比例,否则默认为0,这将除去小数部分。您的ObjectParameter类可能具有精度和缩放属性,或者您可以谷歌“如何在ObjectParameter上设置精度和缩放”并找到适当的方法。

答案 1 :(得分:1)

Per this forum post,您似乎需要在.NET中指定两个输出参数的精度和比例。

所以尝试添加:

.Parameters("@covByIndiv").Precision=18
.Parameters("@covByIndiv").Scale=2

.Parameters("@covByIns").Precision=18
.Parameters("@covByIns").Scale=2

如果这没有帮助,请尝试将您的类型从numeric(18,2)更改为decimal(18,2)。也许EF会更好地处理小数类型。

答案 2 :(得分:0)

这应该有效。使用十进制数学而不是整数数学。

SELECT @covByIndiv=(@cost*20.0)/100.0,@covByIns=(@cost*80.0)/100.0

答案 3 :(得分:0)

我没有得到存储过程来返回我的小数位,而不管我尝试了什么。

所以我做了我一直都知道的事情,我废弃了存储过程,只是在代码中进行了数学运算。虽然我想知道如何解决这个问题,而不是做一个旁路,但我无法弄明白。

答案 4 :(得分:0)

您需要使用FLOAT类型。在VB.Net中,我这样做: cmdSQL1.Parameters.Add(新SqlClient.SqlParameter(“ @ VAT”,SqlDbType.Float))。Direction = ParameterDirection.Output