超出C#到SQL的范围错误

时间:2010-08-30 15:16:09

标签: c# sql

我有一个存储过程如下

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'超出范围。”

2 个答案:

答案 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,那对我来说会更快。