3 Stimmen

Dezimaler arithmetischer Überlauf

Ich kann das einfach nicht lösen. Ich versuche, den Wert von TOTAL auf der Grundlage der folgenden Bedingung zu summieren, was einen ArithmeticOverflow verursacht:

var rawData = (from e in Context.TOTALS
                where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
                select e.TOTAL).Sum();

Wenn ich jedoch die Bedingung in zwei getrennte Abfragen aufteile, funktioniert es:

var rawData1 = (from e in Context.TOTALS
                where (e.PAN == "2600000246696")
                select e.TOTAL).FirstOrDefault();

var rawData2 = (from e in Context.TOTALS
                 where (e.PAN == "2600000246701")
                 select e.TOTAL).FirstOrDefault();

decimal? output = rawData1 + rawData2; //output is 696768.0186M

Der Wert passt eindeutig in eine Dezimalzahl, und ich kann nicht erkennen, warum es zu irgendwelchen Verengungsumrechnungen kommen sollte.

Ich verwende Entity Framework mit einem Oracle-Backend.

5voto

jason Punkte 227577

Im ersten Fall wird die Summe in der Datenbank ausgeführt. Im zweiten Fall wird die Summe im Speicher, clientseitig, in .NET ausgeführt. Ich würde vermuten, dass Sie in der Datenbank einen Überlauf haben. Da Sie uns den Datentyp in der Datenbank nicht mitgeteilt haben und nicht wissen, ob PAN ist ein eindeutiger Bezeichner für TOTALS Wir verfügen nicht über genügend Informationen, um dies mit Sicherheit feststellen zu können, aber ich würde mich auf jeden Fall zuerst darauf konzentrieren.

Bearbeiten: Hier ist eine Möglichkeit, den Unterschied zu sehen. Schreiben Sie Ihren Code um als

var rawData = (from e in Context.TOTALS
               where (e.PAN == "2600000246701" || e.PAN == "2600000246696")
               select e.TOTAL
              ).AsEnumerable()
               .Sum();

En AsEnumerable dort drinnen zwingt die Sum die im Speicher zu berechnen sind. Ohne sie wird die Sum auf der Datenbank ausgeführt wird. Im letzteren Fall wissen Sie, dass Sie die Überlaufausnahme erhalten. Im ersten Fall vermute ich, dass dies nicht der Fall ist. Wenn ja, dann liegt das Problem in der Datenbank.

Außerdem ist zu beachten, dass die zweite Version Ihres Codes nicht unbedingt die der ersten Version Ihres Codes entspricht. Sie haben uns nicht gesagt, obwohl es ganz danach aussieht, ob PAN ist ein eindeutiger Bezeichner. Wenn dies nicht der Fall ist, rufen Sie im zweiten Fall nur eine Instanz von TOTALS Das hat PAN gleich jeder der angegebenen PAN s. In Ihrer ersten Version summieren Sie über alle Instanzen von TOTALS mit dem angegebenen PAN s. Deshalb muss ich ein wenig vorsichtig sein und kann nur sagen, dass es so aussieht, als ob die Datenbank überläuft, aber wir können es nicht mit Sicherheit sagen.

0voto

h1ghfive Punkte 63

Wenn Sie sicher sind, dass der Wert in eine Dezimalzahl passt, sollten Sie das Protokoll Ihrer Oracle-Datenbank überprüfen. Die Sum()-Operation wird darauf ausgeführt, so dass der Überlauf vielleicht in Ihrer Datenbank und nicht durch das .NET Framework verursacht wird.

0voto

Ich nehme an, Sie haben in Ihrer Datenbank mehr als eine e.PAN == "2600000246696" und/oder mehr als eine e.PAN == "2600000246701"

Die erste Abfrage nimmt alle Zeilen aus der Datenbank und gibt Ihnen die Summe. In Oracle ist das in Ordnung (wird nicht überlaufen). Wäre eine große Zahl (die nicht in Dezimalzahlen passt).

Die letzten beiden Abfragen nehmen eine Zeile für die erste und eine Zeile für die zweite.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X