Non Le type System.Decimal a une gamme beaucoup plus large de valeurs (-79,228,162,514,264,337,593,543,950,335 :: 79.228.162.514.264.337.593.543.950.335) que l'SQLite ENTIER 8 octets (-9,223,372,036,854,775,808 :: 9,223,372,036,854,775,807) et nécessite plus de précision que le REAL SQLite (IEEE-754) peut fournir .
De http://www.sqlite.org/datatype3.html:
Une colonne avec une affinité NUMERIC peut contenir des valeurs en utilisant les cinq stockage classes. Lorsque les données textuelles sont insérées dans une colonne NUMERIC, la classe de stockage du texte est convertie en INTEGER ou REAL (dans l'ordre de préférence ) si une telle conversion est sans perte et réversible. Pour conversions entre le texte et REAL classes de stockage, SQLite considère la conversion être sans perte et réversible si les 15 premiers chiffres décimaux significatifs du nombre sont conservés. Si la conversion sans perte de TEXT à INTEGER ou REAL n'est pas possible alors la valeur est enregistrée en utilisant la classe de stockage TEXT. Non tentative de convertir les valeurs BLOB NULL ou .
Une chaîne peut ressembler à une virgule flottante littéral avec un point décimal et/ou d'exposant, mais comme que la valeur peut être exprimée en un entier, l'affinité NUMERIC va le convertir en un entier . Par conséquent, la chaîne '3.0e + 5' est stockée dans une colonne avec l'affinité NUMERIC comme entier 300000, pas comme valeur flottante valeur 300000.0.
Si vous comparez -7.92281625142644e+28
à -79,228,162,514,264,337,593,543,950,335
, vous verrez que la valeur en virgule flottante a été arrondi à une valeur (-79,228,162,514,264,400,000,000,000,000) qui est en dehors des limites de ce que System.Decimal peut stocker. Votre fournisseur ADO.NET fait de son mieux, mais en raison des conversions de données, cela ne fonctionnera pas. Si vous avez vraiment besoin de stocker la gamme complète de System.Decimal, alors vous allez devoir la stocker en tant que texte, et vous vous résignerez à ne pas pouvoir utiliser la valeur comme un nombre dans SQLite.
Je peux voir la valeur suivante stockée dans la table (via SQLite Database Browser) '-7.92281625142644e + 28' .Il semble être stocké sous forme de chaîne. Je suppose qu'il est arrondi à une valeur plus élevée et donc lors de la conversion en décimal à partir de la chaîne, j'obtiens l'exception OverflowException. – alwayslearning