我正在使用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中浮点数的限制。也许我在选择数据类型时选择不好?
答案 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个总数+十进制(和负数符号),以便将其强制转换为列。