Ошибка вне диапазона от C # до SQL - PullRequest
0 голосов
/ 30 августа 2010

У меня есть хранимая процедура следующим образом

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, @promocode, @giftCertificateCode с точно такими же значениями я получаю исключение в коде. На нем написано «69,99» вне диапазона.

В моей таблице и в хранимых процедурах у меня есть столбцы с плавающей точкой. Я просто не понимаю, почему передача в C # double дает мне ошибку точности. Кто-нибудь может посоветовать?

Edit:

Вот код 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);

Считыватель имеет нулевое значение после попытки выполнить операцию. Выдает исключение, говорящее, что «Параметр данных« 69,99 »находится вне диапазона».

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

Оказывается, изменение типа на Десятичное (18,4) делает свое дело. Видимо, типы с плавающей точкой в ​​SQL Server 2008 являются ошибочными. Для меня это сработало бы раньше, если бы я помнил, чтобы поменял DbType на Decimal в коде C #.

0 голосов
/ 30 августа 2010

ОК, вы НЕ должны иметь чисел, хранящихся как числа с плавающей запятой, если вы выполняете математические вычисления на них.Вы должны исправить ваши таблицы, прежде чем делать что-либо еще.Поплавки крайне бедны в использовании, поскольку они неточны, всегда.

В вашем sp (который не должен начинаться с sp_ BTW - то есть для системных процедур, и SQL Server будет сначала проверять основную базу данных при каждом запуске, что является пустой тратой времени обработки)

Ваш sp не принимает float, он определяется как десятичное число (4,2).Запустите Profiler и посмотрите, что код C # пытается отправить в базу данных.Могу поспорить, что он отправляет более 2 десятичных знаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...