2012-07-04 23 views
8

Me pregunto si esto es un error o si voy a hacer algo mal.Excepción de desbordamiento al leer valores decimales de SQL Server

Estoy cargando valores con SqlDataReader desde una base de datos de SQL Server 2008, pero bajo ciertas circunstancias, no puede convertir los valores SQL en valores .net. (.NET 4.0)

he trazado hacia abajo a un caso de prueba que demuestra el problema real:

Ejemplo de trabajo:

"select convert(decimal(38, 19), 260000) as test" 
rs.GetValue(1); 
--> returns 260000 (decimal) 

exmaple No trabaja:

"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) 

He examinado los valores reales que retomó SQL Server. Difieren de que el que no funciona usa 4 enteros para expresar el valor, el de trabajo solamente 3.

También revisé el código fuente con el reflector .net que dio a conocer que se lanza una excepción si existe el valor de más luego 3 valores, pero no entiendo la mecánica detrás de ellos.

Entonces, me pregunto si esto es un error genuino en el .NET Framework.

+0

La precisión para los valores decimales es solo hasta 28.Vaya a través del enlace http://stackoverflow.com/questions/745270/c-sharp-sizeof-decimal – praveen

+0

Pero el ejemplo de trabajo incluso utiliza una mayor precisión. – Chuck

Respuesta

6

No es algo que estés haciendo mal, aparte de ser demasiado preciso quizás. No creo que sea un new problem either.

Se podría argumentar que es un error, o simplemente un vacío en la funcionalidad. La estructura .NET Decimal simplemente no puede representar el valor que está almacenado en su SQL Server decimal por lo que se genera un OverflowException.

O necesita manipular el valor de algo compatible en la base de datos antes de recuperarlo o, leer los datos en un formato binario sin formato o de cadena y manipular en el lado .Net.

Alternativamente, podría escribir un nuevo tipo que lo maneje.

Probablemente sea más simple simplemente usar una definición compatible decimal en primer lugar, a menos que realmente necesite esa precisión. Si lo hace, me interesaría saber por qué.

+0

Los parámetros de precisión fueron elegidos por el servidor SQL. Originalmente estaba haciendo algunos cálculos básicos en el servidor entre los campos (10,2) y (10,4). El servidor seleccionó (36,26) como el tipo de devolución. Cambié todos los campos a (18,4) ahora, y está funcionando hasta el momento. – Chuck

Cuestiones relacionadas