Dezimalstellen werden nicht richtig gerundet - ist das ein LINQ to SQL Bug?

8

Mein Datenbankfeld (SQL Server 2005) ist mit numerisch (15,2) definiert.

Die von LINQ 2 SQL generierte Eigenschaft ist

%Vor%

Im Debug überprüfe ich den Entity-Wert für diese Eigenschaft = 23.6363636363 (etc)

Ich gehe dann über context.SubmitChanges ()

Ich habe SQL Profiler ausgeführt und dies ist die update-Anweisung.

%Vor%

Wie Sie sehen können @ p9 = 23.63, würde ich erwarten, dass es 23,64 ist.

Aktualisieren

Meine Frage ist,

Wenn dies ein LINQ to SQL-Bug ist, würde ich erwarten, dass es ein bekannter ist, wo würde ich das herausfinden? Gibt es irgendwo eine Fehlerliste?

Auch Was wäre die beste Arbeit?

  • Ich denke, das Feld auf 15,3 zu ändern würde den Fehler nicht beheben, es würde nur um eine Dezimalstelle verschoben werden.
  • Das Überschreiben von OnMy_Property_NameChanged () würde für diese Eigenschaft funktionieren, aber ich habe viele davon.

Update 2

das hat auch nicht funktioniert, es geht in dieses Stück Code vor Sendänderungen und scheint zu funktionieren, aber das generierte Update sql hat immer noch den abgeschnittenen Wert, nicht diesen aktualisierten gerundeten Wert.

%Vor%

Der Fix, den ich im Moment habe, besteht darin, den Entity-Wert direkt zu aktualisieren.

    
Paul Rowland 26.02.2010, 06:10
quelle

3 Antworten

1

MSDN sagt:

  

Dezimal und Geldarten Der Standardwert   Genauigkeit des SQL Server-DECIMAL-Typs   (18 Dezimalstellen nach links und   Recht des Dezimalpunktes) ist viel   kleiner als die Genauigkeit der CLR   Dezimal-Typ, mit dem es gepaart wird   Standard. Dies kann zu Präzision führen   Verlust beim Speichern von Daten in der   Datenbank. Aber genau das Gegenteil   kann passieren, wenn der SQL Server DECIMAL   type ist mit größer als konfiguriert   29 Stellen der Genauigkeit. Wenn ein SQL   Server DECIMAL Typ wurde   konfiguriert mit einer größeren Genauigkeit   als das CLR-System. Dezimal, Präzision   Beim Abrufen von Daten kann ein Verlust auftreten   aus der Datenbank.

Sie könnten das umgehen, indem Sie OnMy_Property_NameChanged() überschreiben und dort runden. Stellen Sie sicher, dass Sie den richtigen Rundungsmodus (auf gerade oder von Null) angeben.

    
Johannes Rudolph 26.02.2010 06:17
quelle
1

Es sieht für mich, als ob Link zu SQL ist Abschneide der Wert auf 2 Dezimalstellen anstelle von Rundung es.

    
Bevan 27.02.2010 04:03
quelle
0

es scheint der Fehler von LINQ. Sie müssen DBType von Decimal(15,2) in Decimal(15,3) ändern. Das ist eine um 1 höhere Genauigkeit als die Spaltengenauigkeit in der Datenbank.

    
Adeel 26.02.2010 06:32
quelle