2009-06-03 9 views
0

Je crée une application utilitaire de chargement de données (Win 7 64bit, VS 2008, C#, .Net 3.5, Win Forms) en utilisant Subsonic 2.2.
J'ai tout mis en œuvre en utilisant SqlServer et maintenant je dois le faire fonctionner dans Sqlite 3. J'ai travaillé sur certains problèmes mais il y en a un que je ne peux pas résoudre;
J'ai 2 colonnes, Latitude et Longitude qui sont des types de données FLOAT dans sqlite et Subsonic génère comme des flottants Nullable. La génération de code est bonne, la construction est bien, mais quand je tente d'exécuter l'application, quand l'objet est sauvegardé, je reçois une erreur, "Impossible de sauvegarder: Longitude dépasse la longueur maximale de 8". Je pense qu'il s'agit d'un problème de vérification dans Subsonic, car ma base de données Sqlite a maintenant un problème avec les données que j'ai chargées dans ces colonnes.
Tous les anciens combattants Subsonic ou Sqlite ont des suggestions, je suis tout nouveau chez Subsonic et je travaille avec Sqlite depuis environ 6 mois.Subsonic + Sqlite + Float datatype == "Impossible d'enregistrer: xxx dépasse la longueur maximale de 8"

Merci, Geoff

La valeur qui est à l'origine de l'erreur est -122,41082 qui est plus de 8 caractères, mais je ne pense pas que ce soit la limite pour un flotteur dans SQLite. Peut-être que je choisis mal quand il s'agit de types de données?

+0

Pouvez-vous me rendre un service et faire un Math.Round() pour que j'obtienne la décimale? –

+0

J'utilise actuellement un lat fixe/long (37.77188, -122.410819) pour ce point. Je vais tirer dans les vrais coords plus tard. J'ai testé avec le Math.Round() et j'ai trouvé que si je terminais à 3 sur le long cela fonctionnerait. Donc SS semble vraiment compter le champ float comme s'il s'agissait d'un champ varchar (8). – TheGeoff

Répondre

2

Ce problème est SQLite que, d'après ce que je comprends, SQLite ne dispose pas d'un concept de « types » - Seules les conclusions sur les valeurs:

http://www.sqlite.org/faq.html#q3 How to ALTER sqlite column (iPhone)?

Ce que je devine ici est que la conclusion se perd sur la traduction de flotteur - si vous lisez les documents, il est dit que beaucoup:

Une colonne avec une affinité NUMERIC peut contenir des valeurs en utilisant tout le stockage de cinq classes. Lorsque les données textuelles sont insérées dans une colonne NUMERIC, une tentative est faite pour le convertir en nombre entier ou nombre réel avant qu'il ne soit stocké. Si la conversion est réussie (ce qui signifie que la conversion se produit sans perte d'information), alors la valeur est stockée en utilisant la classe de stockage INTEGER ou REAL . Si la conversion ne peut être effectuée sans perte de informations alors la valeur est stockée en utilisant la classe de stockage TEXT

Il semble donc que la valeur que vous êtes en passant ne peut être stocké sous forme de REAL (pour pour une raison quelconque) et essaye d'être modifié en TEXT, avec la limitation d'une longueur de 8. Cela a aussi du sens car il compte la décimale - et il ne devrait pas le faire (il le ferait seulement s'il s'agit d'un texte).

Bonne lecture ici: http://www.sqlite.org/datatype3.html#affinity

Il ressemble à ceci est la question que vous avez affaire. Dans l'ensemble, SQLite est une base de données "ducktyped", et beaucoup de gens ont été mordus par elle. Donc, en bref, je pense que votre réponse est probablement d'utiliser Math.Round (3) pour amener la valeur en dessous de 8 nombres totaux + décimal (et le symbole négatif) afin qu'il puisse être forcé dans la colonne.

Questions connexes