是否可以在SQLite中存储System.Decimal.MinValue和System.Decimal.MinValue?

时间:2010-07-02 12:33:52

标签: database sqlite ado.net decimal

考虑到SQLite支持的数据类型的最大大小是8个字节,我可以在NUMERIC列中存储Decimal.MinValue,Decimal.MaxValue。我通过phxsoftware将ADO.NET provider用于SQLite。驱动程序是否在内部将值存储为字符串并进行双向转换?

我在尝试检索Decimal.MinValue / MaxValue时遇到System.OverflowException。

1 个答案:

答案 0 :(得分:1)

没有。 System.Decimal类型具有比SQLite 8字节INTEGER(-9,223,372,036,854,775,808 :: 9,223,372,036,854,775,807)更宽范围的值(-79,228,162,514,264,337,593,543,950,335 :: 79,228,162,514,264,337,593,543,950,335),并且需要比SQLite REAL(IEEE-754)更高的精度。可以提供。

来自http://www.sqlite.org/datatype3.html

  

具有NUMERIC亲和力的列可以   包含使用所有五个存储的值   类。插入文本数据时   进入NUMERIC列,存储   文本的类被转换为   INTEGER或REAL(按顺序)   (如果有这样的转换)   无损且可逆。对于   TEXT和REAL之间的转换   存储类,SQLite认为   转换为无损和   如果前15个重要可逆   数字的十进制数字是   保存。如果无损转换   TEXT到INTEGER或REAL不是   可能然后存储该值   使用TEXT存储类。没有   尝试转换NULL或   BLOB值。

     

字符串可能看起来像   带小数的浮点字面值   点和/或指数表示法,但为   只要该值可以表示为   一个整数,NUMERIC亲和力   将其转换为整数。因此,   字符串'3.0e + 5'存储在一列中   以NUMERIC affinity为整数   300000,不作为浮点   价值300000.0。

如果将-7.92281625142644e+28-79,228,162,514,264,337,593,543,950,335进行比较,您会看到浮点值已向下舍入为超出System.Decimal可存储范围的值(-79,228,162,514,264,400,000,000,000,000) 。您的ADO.NET提供商正在尽最大努力,但由于数据转换,它将无法正常工作。如果你真的需要存储System.Decimal的全部范围,那么你将不得不将它存储为文本,并让自己不能在SQLite中作为数字操作值。