Десятичные разряды, не округляющиеся правильно - действительно ли это - LINQ к ошибке SQL?

Мое поле базы данных (SQL-сервер 2005) определяется с числовым (15,2).

Сгенерированное свойство LINQ 2 SQL

    [Column(Storage="_My_Property_Name", DbType="Decimal(15,2)", UpdateCheck=UpdateCheck.Never)]
    public System.Nullable<decimal> My_Property_Name
    {
        get
        {
            return this._My_Property_Name;
        }
        set
        {
            if ((this._My_Property_Name != value))
            {
                this.OnMy_Property_NameChanging(value);
                this.SendPropertyChanging();
                this._My_Property_Name = value;
                this.SendPropertyChanged("My_Property_Name");
                this.OnMy_Property_NameChanged();
            }
        }
    }

В отладке я проверяю значение объекта на это свойство = 23.6363636363 (и т.д.)

Я затем переступаю через контекст. SubmitChanges ()

У меня есть выполнение SQL Profiler, и это - оператор обновления.

exec sp_executesql N'
UPDATE [Staging].[My_Table_Name]
    SET [LAST_UPDATE_DATE] = @p2, [Field1] = @p3, [Field2] = @p4, [Field3] = @p5, [Field4] = @p6, [Field5] = @p7, [Field6] = @p8, [Field7] = @p9
WHERE ([Id] = @p0) AND ([RecordVersion] = @p1)

SELECT [t1].[RecordVersion] FROM [Staging].[My_Table_Name] AS [t1]
WHERE ((@@ROWCOUNT) > 0) AND ([t1].[Id] = @p10)',N'@p0 int,@p1 timestamp,@p2 datetime,@p3 decimal(21,8),@p4 decimal(21,8),@p5 decimal(21,8),@p6 decimal(21,8), @p7 decimal(21,8),@p8 decimal(21,8),@p9 decimal(15,2),@p10 int',@p0=2935,@p1=0x0000000000323018,@p2='2010-02-26 16:49:21:690', @p3=99.99992307,@p4=99.99992307,@p5=99.99992307,@p6=99.99992307,@p7=99.99992307,@p8=99.99992307,
@p9=23.63,@p10=2935

Поскольку Вы видите @p9 = 23.63, я ожидал бы, что это будет 23.64.

Обновление

Мой вопрос,

Если бы это - LINQ к ошибке SQL, я ожидал бы, что это будет известным, где был бы я узнавать это; где-нибудь существует ли ведомый список ошибки?

Также, какова была бы лучшая работа вокруг?

  • Я предполагаю, что изменение поля к 15,3 не исправило бы ошибку, это просто сместит его 1 десятичный разряд.
  • Переопределение OnMy_Property_NameChanged () работало бы на это свойство, но у меня есть многие из них.

Обновление 2

это не работало также, это входит в эту часть кода прежде submitchanges и, кажется, работает, но сгенерированное обновление sql все еще имеет усеченное значение, не это обновленное округленное значение.

partial void OnMy_Property_Name_ChangingChanging(decimal? value)
{
    if (!value.HasValue)
    {
        return;
    }
    value = 
        Math.Round(value.Value, 2, MidpointRounding.AwayFromZero);
}

Фиксация, которую я имею в данный момент, должна только обновить значение объекта непосредственно.

8
задан Tom H 13 July 2010 в 14:39
поделиться

3 ответа

MSDN говорит:

Десятичные и денежные типы. Точность по умолчанию для типа DECIMAL SQL Server ( 18 десятичных цифр слева и справа от десятичной точки) намного меньше, чем точность десятичного типа CLR , с которым он связан с По умолчанию. Это может привести к потере точности при сохранении данных в базе данных . Однако может произойти прямо противоположное , если тип SQL Server DECIMAL настроен с точностью более 29 цифр. Если тип DECIMAL сервера SQL был настроен с большей точностью , чем CLR System.Decimal, точность может быть потеряна при извлечении данных {{1 }} из базы данных.

Вы можете справиться с этим, переопределив OnMy_Property_NameChanged () и округлив его там. Убедитесь, что вы указали правильный режим округления (до четного или от нуля).

1
ответ дан 6 December 2019 в 01:39
поделиться

похоже, ошибка LINQ. вам необходимо изменить DBType с Decimal (15,2) на Decimal (15,3) . Это увеличение точности на 1 больше, чем точность вашего столбца в базе данных.

0
ответ дан 6 December 2019 в 01:39
поделиться

Мне кажется, что Link to SQL усекает значение до двух знаков после запятой вместо округления Это.

1
ответ дан 6 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: