场合
正如问题所说,我有一个程序,在输入一个值后,这个值被发送到我的商店程序,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.所以任何帮助将不胜感激。
的问候。
答案 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