Тип данных Subsonic + Sqlite + Float == "Не удается сохранить: xxx превышает максимальную длину 8" - PullRequest
0 голосов
/ 04 июня 2009

Я создаю приложение-утилиту загрузчика данных (Win 7 64bit, VS 2008, C #, .Net 3.5, Win Forms) с использованием Subsonic 2.2.
У меня все работает, используя SqlServer, и теперь мне нужно, чтобы оно работало в Sqlite 3. Я работал над некоторыми проблемами, но есть одна, которую я не могу решить;
У меня есть 2 столбца, Широта и Долгота, которые являются типами данных FLOAT в sqlite и Subsonic генерирует как обнуляемые числа с плавающей точкой. Генерация кода в порядке, сборка в порядке, но когда я пытаюсь запустить приложение, когда объект сохраняется, я получаю сообщение об ошибке: «Не удается сохранить: долгота превышает максимальную длину 8».
Я предполагаю, что это проблема проверки в Subsonic, поскольку моя база данных Sqlite теперь имеет проблему с данными, которые я загружаю в эти столбцы.
У любого ветерана Subsonic или Sqlite есть какие-либо предложения, я новичок в Subsonic и работаю со Sqlite только около 6 месяцев.

Спасибо, Джефф

Значение, вызывающее ошибку: -122.41082, что превышает 8 символов, но я не думаю, что это предел для числа с плавающей запятой в sqlite. Может быть, я плохо выбираю типы данных?

1 Ответ

2 голосов
/ 04 июня 2009

Это проблема SQLite, поскольку, насколько я понимаю, SQLite не имеет понятия «типы» - только выводы для значений:

http://www.sqlite.org/faq.html#q3 Как изменить столбец sqlite (iPhone)?

Я предполагаю, что при переводе с плавающей запятой теряется вывод - если вы читаете документы, он говорит так же:

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

Похоже, что передаваемое вами значение НЕ может быть сохранено как РЕАЛЬНОЕ (по какой-то причине) и пытается быть настроенным на ТЕКСТ с ограничением длины 8. Это также имеет смысл, потому что он считает десятичную дробь - и не должен (только если это текст).

Прочитайте здесь: http://www.sqlite.org/datatype3.html#affinity

Похоже, это проблема, с которой вы имеете дело. В целом, SQLite - это база данных типа «ducktyped», и многие укусили ее.

Итак, вкратце, я думаю, что ваш ответ, вероятно, состоит в том, чтобы использовать Math.Round (3), чтобы привести значение к целому числу менее 8 + десятичному (и отрицательному символу), чтобы его можно было привести в столбец.

...