sql类型浮点数,实数,小数?

时间:2011-07-12 04:06:51

标签: c# sql floating-point decimal

在我的数据库中,我有一个产品价格的柱子 我把它作为float,我的问题是如果我从我的c#应用程序中保存它 作为10.50 ..在查询中它返回10,50并且如果我更新我得到一个错误 10,50无法转换为float ......或者其他类似内容.. 如果我把它保存为decimal,在sql管理中的查询..是好的.. 但在我的c#应用程序中......我得到了同样的错误.. 10.50重新调整为10,50我不知道为什么,以及如何解决它...我的独特解决方案是保存它 如varchar ...

6 个答案:

答案 0 :(得分:1)

这是某种本地化问题。 10,50是写“十分之一”的“欧洲”方式。如果您从select语句中获取该数据,那么您的数据库可能配置不正确。

答案 1 :(得分:1)

一般来说,您应该在整个图层中使用相同的类型。因此,如果数据库中的基础类型为x,则应在c#中传递具有相同类型的数据。

你选择什么类型取决于你所存储的内容 - 你不应该只是转换类型来获得“工作”的东西。为此,以非数字类型(例如varchar)存储数字数据将很快回来咬你。很高兴你打开这个问题来解决这个问题!

正如其他人奇迹般地推断出的那样,您可能会遇到本地化问题。这是为什么将数字存储为字符串是个问题的一个很好的例子。如果您在他们想要的任何文化/本地化中正确接受用户输入(或者您想要),并将其转换为数字类型变量,那么其余的(与数据库交谈)应该很容易。更重要的是,如果你可以帮助它,你不应该在数据库中进行数字格式化 - 这些东西更好地放在前端,更靠近用户。

答案 2 :(得分:0)

我认为你在windows区域和十进制符号语言中的设置是错误的。请将其设置为点并再次测试它。

答案 3 :(得分:0)

这可能有助于临时使用,但我不建议将其永久使用:

尝试制作它,以便在保存文件之前,将数字转换为字符串,用逗号(From,to。)替换逗号,然后将其作为字符串保存到数据库中,希望它应该看到它格式正确,并将其转换为数据库视为“十进制”或“浮动”的内容。

希望这有帮助。

答案 4 :(得分:0)

是的,本地化。

那就是说,我认为你的pice存储在SQLServer的“money”字段中(我假设它是你正在使用的SQLServer)。如果这是DB中的浮点数,它将返回正常小数点,而不是欧洲货币分隔符“,”。

修复: 除非您绝对需要浮点数,否则请在c#代码中使用不要使用FLOAT 。请改用十进制类型。这不仅仅是在这种情况下,而是在所有情况下。浮点数是二进制(base-2),而不是十进制(base-10),因此您在界面中看到的只是实际数字的十进制近似值。结果是经常(1 == 1) evaluates as false!

我自己遇到了这个问题,如果你不知道会发生什么事,那就太疯狂了。始终在c#中使用decimal而不是float

好的,在您修复之后,请执行此操作以获得正确的本地化:

using System.Globalization;
...

NumberFormatInfo ni = new NumberFormatInfo();
ni.CurrencyDecimalSeparator = ",";
decimal price = decimal.Parse(dbPriceDataField, ni);

请注意,“dbPriceDataField”必须是字符串,因此您可能必须在该db resultset的字段上执行“.ToString()”。

如果您最终必须处理该货币领域的其他“金钱”方面,例如货币符号,请查看:http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx

如果你需要更强大的错误处理,可以将decimal.Parse放在try / catch中,或者使用decimal.TryParse。

编辑 -

如果你知道什么文化(真的,国家),db设置为,你可以这样做:

using System.Globalization;
...
CultureInfo ci = new CultureInfo("fr-FR"); // fr-FR being "french France"
decimal price = decimal.Parse(dbprice, ci.NumberFormat);

答案 5 :(得分:0)

我的Web应用程序中遇到了这些问题...但我发现像我这样的解决方案是在文本框中获取价格值。所以我附上了数据库。因此,当您使用文本框附加数据库时...右键单击文本框并单击编辑数据绑定....您必须提供....类似于绑定属性..... {0:N2} < / p>

这仅适用于网络应用或网站...不适用于桌面应用......