Exception de dépassement de capacité lors de la lecture des valeurs décimales à partir de SQL Server
Je me demande si c'est un bug ou si je vais quelque chose de mal.
Je suis valeurs de chargement avec un SqlDataReader
à partir d'une base de données SQL Server 2008, mais dans certaines circonstances, il ne parvient pas à convertir le SQL des valeurs dans .des valeurs nettes. (.NET 4.0)
J'ai fait remonter un test qui montre le véritable problème:
De travail exemple:
"select convert(decimal(38, 19), 260000 ) as test"
rs.GetValue(1);
--> returns 260000 (decimal)
Pas de travail exemple:
"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)
J'ai examiné les valeurs réelles que le Serveur SQL retured. Ils diffèrent que le non-travail on utilise 4 entiers pour exprimer la valeur, le travail d'un seul 3.
J'ai aussi vérifier le code source .net Réflecteur qui a dévoilé qu'une exception est levée si la valeur existe, de plus de 3 valeurs, mais je ne comprends pas la mécanique derrière eux.
Donc, je me demande si c'est un véritable bug dans le .net framework.
Mais l'exemple même utilise une plus grande précision.
OriginalL'auteur Chuck | 2012-07-04
Vous devez vous connecter pour publier un commentaire.
Ses pas quelque chose que vous faites mal, en plus d'être trop précis, peut-être. Je ne pense pas que ses un nouveau problème.
On pourrait dire ses un bug, ou tout simplement une lacune dans la fonctionnalité. L' .Net
Decimal
structure juste ne peut pas représenter la valeur qui est stockée dans SQL Serverdecimal
donc unOverflowException
est levée.Soit vous en avez besoin pour manipuler la valeur à quelque chose de compatible dans la base de données avant de les récupérer ou les, lire les données dans un binaire brut ou de chaîne de format et de manipuler des sur la .Net.
Alternativement, vous pouvez écrire un nouveau type qui gère.
Il est probablement plus simple de juste utiliser un compatible
decimal
définition en premier lieu, à moins que vous vraiment besoin de cette précision. Si vous le faites, je serais intéressé à savoir pourquoi.OriginalL'auteur Jodrell