Überlauf-Ausnahme beim Lesen von decimal-Werten aus SQL Server
Frage ich mich, ob das ein bug ist oder falls ich etwas falsch.
Bin ich be-Werte mit einem SqlDataReader
aus einer SQL Server 2008 Datenbank, aber unter Umständen nicht konvertiert die SQL-Werte in .Netto-Werte. (.NET 4.0)
Habe ich verfolgt Sie auf einem test-Fall, der zeigt das eigentliche problem:
Beispiel:
"select convert(decimal(38, 19), 260000 ) as test"
rs.GetValue(1);
--> returns 260000 (decimal)
Nicht funktioniert Beispiel:
"select convert(decimal(36, 26), 260000 ) as test"
rs.GetValue(1);
--> throws
System.OverflowException: Conversion overflows.
at System.Data.SqlClient.SqlBuffer.get_Decimal()
at System.Data.SqlClient.SqlBuffer.get_Value()
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValues(Object[] values)
Habe ich geprüft, die eigentlichen Werte, die SQL Server retured. Sie unterscheiden sich darin, dass die nicht arbeiten verwendet man 4 ganze zahlen Ausdrücken den Wert, den man nur 3.
Habe ich auch den Quellcode mit .net Reflector die enthüllt, dass eine Ausnahme geworfen wird wenn der Wert vorhanden ist, der mehr als 3 Werte, aber ich verstehe nicht die mechanik hinter Ihnen.
So, ich Frage mich, ob das ein echter bug in der .net framework.
- Präzision für dezimal-Werte ist nur bis 28 .Bitte gehen Sie durch den link stackoverflow.com/questions/745270/c-sharp-sizeof-decimal
- Aber das funktioniert beispielsweise auch verwendet, die eine höhere Genauigkeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seine nicht, was Sie falsch machen, abgesehen von übermäßig präzise vielleicht. Ich glaube nicht, dass es eine neues problem, entweder.
Könnte man argumentieren, its a bug, oder einfach nur eine Lücke in der Funktionalität. Die .Net
Decimal
Struktur kann nicht nur die Darstellung des Wertes, der gespeichert ist in Ihrer SQL Server -decimal
so einOverflowException
geworfen wird.Entweder Sie zu Bearbeiten müssen Sie den Wert auf etwas-kompatibel in der Datenbank, bevor Sie Sie abrufen oder Lesen Sie die Daten in einem raw-binary-oder string-format und Bearbeiten, die auf die .Net-Seite.
Alternativ könnten Sie schreiben, eine neue Art, die es anfaßt.
Ist es wahrscheinlich einfacher, nur um ein kompatibles
decimal
definition in den ersten Platz, es sei denn, Sie wirklich brauchen, dass Präzision. Wenn Sie das tun ich wäre daran interessiert zu wissen, warum.