Subsonic + Sqlite + Float数据类型==“无法保存:xxx超过最大长度8”

时间:2009-06-03 21:38:31

标签: sqlite subsonic

我正在使用Subsonic 2.2构建数据加载器实用程序(Win 7 64位,VS 2008,C#,。Net 3.5,Win Forms)。
   我已经使用SqlServer完成所有工作,现在我需要在Sqlite 3中使用它。我已经解决了一些问题,但有一个我无法解决;
我有2列,Latitude和Longitude,它们是sqlite中的FLOAT数据类型,而Subsonic生成可以为空的浮点数。代码生成很好,构建很好,但是当我尝试运行应用程序时,当对象被保存时,我得到错误,“无法保存:经度超过最大长度8”。
我的猜测是,这是在Subsonic中的一个验证问题,因为我的Sqlite数据库现在已经发现了我已加载到这些列中的数据。
任何Subsonic或Sqlite老手都有任何建议,我是Subsonic的新手,现在只与Sqlite合作约6个月。

谢谢, 杰夫

导致错误的值是-122.41082,超过8个字符,但我不认为这是sqlite中浮点数的限制。也许我在选择数据类型时选择不好?

1 个答案:

答案 0 :(得分:2)

这是一个SQLite问题,因为根据我的理解,SQLite没有“类型”的概念 - 只是对值的推论:

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

我在这里猜测的是,推理在浮动翻译中迷失了 - 如果您阅读了文档,它会说:

  

具有NUMERIC亲和力的列可以   包含使用所有五个存储的值   类。插入文本数据时   尝试进入NUMERIC列   使其转换为整数或   存储之前的实数。如果   转换成功(意思是   没有转换   失去信息),那么价值   使用INTEGER或REAL存储   存储类。如果转换   不能没有损失   信息然后存储该值   使用TEXT存储类

所以看起来你传入的值不能存储为REAL(由于某种原因)并且正在尝试调整到TEXT,限制长度为8.这也是有道理的它计算小数位 - 它不应该(只有它是文本)。

请阅读: http://www.sqlite.org/datatype3.html#affinity

看起来这是你正在处理的问题。总而言之,SQLite是一个“鸭子”数据库,很多人都被它咬了。

因此,简而言之,我认为您的答案可能是使用Math.Round(3)将值设置为低于8个总数+十进制(和负数符号),以便将其强制转换为列。