Можно ли хранить System.Decimal.MinValue и System.Decimal.MinValue в SQLite? - PullRequest
1 голос
/ 02 июля 2010

Учитывая, что максимальный размер типа данных, поддерживаемого SQLite, составляет 8 байт, могу ли я сохранить значения Decimal.MinValue, Decimal.MaxValue в столбце NUMERIC. Я использую ADO.NET провайдера для SQLite от phxsoftware. Хранит ли драйвер внутренне значение в виде строки и выполняет ли преобразование в обоих направлениях?

Я получаю исключение System.OverflowException при попытке получить Decimal.MinValue / MaxValue.

1 Ответ

1 голос
/ 02 июля 2010

Нет.Тип System.Decimal имеет гораздо более широкий диапазон значений (-79,228,162,514,264,337,593,543,950,335 :: 79,228,162,514,264,337,593,543,950,335), чем 8-байтовый INTEGER SQLite (-9,223,372,036,854,775,808: 9,223,375 * REAL);* IEEE-754 ) могу предоставить.

С http://www.sqlite.org/datatype3.html:

Столбец со сходством NUMERIC может содержать значения, использующие все пять классов хранения.Когда текстовые данные вставляются в столбец NUMERIC, класс хранения текста преобразуется в INTEGER или REAL (в порядке предпочтения), если такое преобразование без потерь и обратимо.Для преобразований между классами хранения TEXT и REAL SQLite считает преобразование без потерь и обратимым, если сохраняются первые 15 значащих десятичных цифр числа.Если преобразование TEXT в INTEGER или REAL без потерь невозможно, значение сохраняется с использованием класса хранения TEXT.Не делается никаких попыток преобразовать значения NULL или BLOB.

Строка может выглядеть как литерал с плавающей точкой с десятичной точкой и / или обозначением экспоненты, но до тех пор, пока значение может быть выражено как целое число,Числовое сходство преобразует его в целое число.Следовательно, строка '3.0e + 5' хранится в столбце с NUMERIC-сродством как целое число 300000, а не как значение с плавающей запятой 300000.0.

Если сравнить -7.92281625142644e+28 с -79,228,162,514,264,337,593,543,950,335вы увидите, что значение с плавающей запятой было округлено до значения (-79,228,162,514,264,400,000,000,000,000), которое находится за пределами того, что System.Decimal может хранить.Ваш поставщик ADO.NET делает все возможное, но из-за преобразования данных он просто не будет работать.Если вам действительно необходимо сохранить весь диапазон System.Decimal, вам придется хранить его как текст и смириться с тем, что вы не сможете оперировать значением как числом в SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...