2010-02-26 45 views
8

我的數據庫字段(sql server 2005)是用數字(15,2)定義的。小數位不能正確舍入 - 這是一個LINQ to SQL錯誤嗎?

的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(); 
      } 
     } 
    } 

在調試I檢查實體值此屬性= 23.6363636363(等)

我然後跨過context.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 to SQL的錯誤我希望它是一個已知的一個,在那裏我會發現這一點; 有沒有維護的錯誤列表?

另外什麼是最好的解決辦法?

  • 我猜變化領域15,3不會修復bug,它只是轉移其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); 
} 

我目前得到的修復只是直接更新實體值。

回答

1

MSDN說:

小數和貨幣類型的默認 精密的SQL Server DECIMAL類型的 (18位小數的左側和小數點 右)比的精確度要小得多 CLR 與之配對的小數類型默認爲 。將數據保存到 數據庫時,這會導致精度爲 。但是,如果SQL Server DECIMAL 類型配置了大於 的29位精度,則可能會發生相反的 。當SQL 服務器DECIMAL類型爲 配置比CLR系統更高的精度 。從數據庫中檢索數據 時可能發生十進制,精度爲 。

你可以通過覆蓋OnMy_Property_NameChanged()並在那裏四捨五入來處理這個問題。確保你指定了正確的舍入模式(從零到零)。

+0

如果我直接用23.63636363636363更新數據庫,那麼它變成了23.64 ....這是可以的。如果我重寫屬性,那麼它會修復這個屬性,但它有一個大的分貝,有很多15,2定義的字段...我真的不想爲所有這些做這些。我會想如果這是一個Linq 2 Sql的錯誤,它會被發現之前? (謝謝你的回答) – 2010-02-26 06:27:02

+0

如果你對此有信心,我建議使用反射器來挖掘linq2sql內部。顯然這是關於查詢生成器的。 – 2010-02-26 06:35:21

0

它似乎是LINQ的錯誤。您需要將DBTypeDecimal(15,2)更改爲Decimal(15,3)。這比數據庫中的列精度增加了1倍的精度。

+0

但是如果我們使用自動數據庫創建,那麼該列將被創建爲(15,3)。 – 2010-02-27 13:12:33

1

在我看來好像鏈接到SQL是截斷價值爲2位小數,而不是四捨五入它。