2010-02-26 8 views
8

Mon champ de base de données (SQL Server 2005) est défini avec numeric (15,2).Les décimales ne sont pas arrondies correctement - est-ce un bug LINQ to SQL?

Le LINQ 2 SQL généré est la propriété

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

En debug je vérifie la valeur de l'entité de cette propriété = 23,6363636363 (etc)

je puis sur l'étape context.SubmitChanges()

J'ai SQL Profiler en cours d'exécution et c'est l'instruction de mise à jour.

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 

Comme vous pouvez le voir @ p9 = 23.63, je m'attendrais à ce qu'il soit 23.64.

Mise à jour

Ma question est,

Si cela est un LINQ bug SQL Je pense que ce soit un connu, où pourrais-je trouver cela; Y at-il une liste de bogues maintenue quelque part?

Quel serait le meilleur travail?

  • Je devine changer le terrain pour ne résoudrait pas 15,3 le bug, il serait tout simplement la déplacer 1 place décimale.
  • Le remplacement de OnMy_Property_NameChanged() fonctionnerait pour cette propriété, mais j'en ai beaucoup.

Mise à jour 2

cela ne fonctionne pas non plus, il va dans ce morceau de code avant SubmitChanges et semble fonctionner, mais le sql de mise à jour généré a toujours la valeur tronquée, pas updated arrondi valeur.

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

Le correctif que j'ai pour le moment est simplement de mettre à jour la valeur de l'entité directement.

Répondre

1

MSDN dit:

Types décimal et argent La valeur par défaut précision de type DECIMAL SQL Server (18 chiffres décimaux à gauche et droite du point décimal) est beaucoup plus petite que la précision des le type décimal auquel il est associé par par défaut. Cela peut entraîner une perte de précision lorsque vous enregistrez des données dans la base de données . Cependant, le contraire peut se produire si le type SQL Server DECIMAL est configuré avec plus de 29 chiffres de précision. Lorsqu'un type de serveur SQL DECIMAL a été configuré avec une plus grande précision que le système CLR.Décimal, précision perte peut se produire lors de la récupération des données à partir de la base de données.

Vous pouvez gérer cela en passant outre OnMy_Property_NameChanged() et en l'arrondissant. Assurez-vous de spécifier le bon mode d'arrondi (pair ou nul).

+0

si je mets à jour la base de données directement avec 23.63636363636363 alors il devient 23.64 .... ce qui est ok. Si je redéfinis la propriété, alors cela réparerait cette propriété mais c'est un gros db avec beaucoup de 15,2 champs définis ... Je ne veux pas vraiment faire ça pour tous. Je pense que si c'est un bug de Linq 2 Sql, il aurait été trouvé avant? (merci pour la réponse) –

+0

Je suggère de creuser dans les internes de linq2sql en utilisant un réflecteur si vous vous sentez confiant à ce sujet. Évidemment, c'est quelque chose à propos du générateur de requêtes. –

0

il semble que le bug de LINQ. vous devez modifier DBType de Decimal(15,2) à Decimal(15,3). C'est incrément 1 précision supplémentaire que la précision de votre colonne dans la base de données.

+0

Mais alors cette colonne sera créée comme (15,3) au cas où nous utiliserions la création automatique de base de données. –

1

Il me semble que si un lien vers SQL est tronquer la valeur à 2 décimales au lieu de l'arrondissement il.