我有一个存储过程如下
create procedure [dbo].[PriceConfirm]
@quote float,
@membershipType int,
@promocode nvarchar(20),
@giftCertificateCode nvarchar(20)
as
if(LEN(@giftCertificateCode)>1)
begin
declare @giftType int
select @giftType = MembershipType from GiftCertificate where GiftCertificateCode=@giftCertificateCode
if @giftType = @membershipType
begin
select 1 as result
end
else
begin
select 0 as result
end
end
else
begin
declare @total float
select @total = Price from MembershipType where TypeID=@membershipType
declare @discount float
select @discount = 0
if(LEN(@promocode)>1)
begin
select @discount = DiscountAmount from Membership_Promo where Promocode=@promocode and MembershipType = @membershipType
end
else
begin
select @discount=0
end
if ABS(@total-@discount-@quote) <.01
begin
select 1 as result
end
else
begin
select 0 as result
end
end
如果我只是在SQL Server Management Studio中执行存储过程,它就可以工作。
exec PriceConfirm @quote=69.99, @membershipType=6, @promocode='1', @giftCertificateCode='1'
返回1,应该如此。
但是在C#中,当我尝试使用完全相同的值传递参数@quote,@ membershipType,@ protocode,@ upgradeCertificateCode时,我在代码中得到一个异常。它显示'69 .99'超出范围。
在我的表和存储过程中,我将列作为浮点数。我只是不明白为什么传入C#double会给我一个精度错误。有人可以提供建议吗?
编辑:
这是C#代码:
IDataAccess dataAccess = _dataAccessService.GetDataAccess();
IDataConnection connection = _dataAccessService.GetConnection(Connectionstring);
var operation = new DataOperation("PriceConfirm");
operation.Parameters.Add(new DataParameter("@quote", DbType.Double, quote));
operation.Parameters.Add(new DataParameter("@membershipType", DbType.Int32, membership));
operation.Parameters.Add(new DataParameter("@promocode", DbType.String, promocode));
operation.Parameters.Add(new DataParameter("@giftCertificateCode", DbType.String, giftcode));
IResultSet reader = dataAccess.ExecuteResultSet(connection, operation, ResultSetType.Reader);
Reader尝试执行操作后为null。它抛出一个例外,说“数据参数'69 .99'超出范围。”
答案 0 :(得分:0)
如果你对它们进行数学计算,那么你不应该将数字存储为浮点数。在做其他事情之前,你应该修复你的表。浮游物使用起来非常糟糕,因为它们总是不精确。
在你的sp中(不应该以sp_ BTW开头 - 这是系统执行程序,SQL Server将在每次运行时首先检查主数据库,这会浪费处理时间)
你的sp不接受float,它被定义为十进制(4,2)。运行Profiler并查看C#代码尝试发送到数据库的内容。我敢打赌它发送超过2位小数。
答案 1 :(得分:0)
事实证明,将类型更改为十进制(18,4)就可以了。显然,SQL Server 2008中的float类型是一种错误。如果我记得在C#代码中将DbType更改为Decimal,那对我来说会更快。