sql type float, real, decimal?

本文关键字:decimal real sql float type | 更新日期: 2023-09-27 18:01:53

在我的数据库中,我有一个产品价格栏我把它作为float,我的问题是如果我从c#应用程序开始保存它作为10.50..在查询中,它返回10,50,如果我更新,我会得到一个错误10,50无法转换为float。。。或者类似的。。如果我把它保存为decimal,在sql管理内部的查询中。。都还好。。但在我的c#应用程序中。。。我也犯了同样的错误。。10.50重新运行为10,50我不知道为什么,以及如何解决它。我唯一的解决方案是保存它作为varchar。。。

sql type float, real, decimal?

这是某种本地化问题。10,50是"欧洲人"写十个半的方式。如果您是从select语句中得到的,那么您的数据库可能配置不正确。

一般来说,您应该在整个层中使用相同的类型。因此,如果数据库中的底层类型是x,那么也应该在c#中传递那些具有相同类型的数据。

你选择什么类型取决于你存储的内容——你不应该为了"工作"而切换类型。为此,以非数字类型(例如varchar(存储数字数据很快就会反噬您。你打开这个问题来解决这个问题真是太好了!

正如其他人奇迹般地推断的那样,您很可能会遇到本地化问题。这是一个很好的例子,说明了为什么将数字存储为字符串是一个问题。如果您正确地接受了用户想要的(或您想要的(任何区域性/本地化的用户输入,并将其转换为数字类型的变量,那么剩下的(与DB对话(应该很容易。更重要的是,如果可以的话,你不应该在数据库中进行数字格式化——这些东西最好放在前端,离用户更近。

我认为您在windows区域和语言中对十进制符号的设置是错误的。请将其设置为点,然后再次测试。

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

试着在保存文件之前,将数字转换为字符串,将逗号替换为句点(From,to。(,然后将其作为字符串保存到数据库中,希望它能看到它的格式正确,并将其转换为数据库所认为的"十进制"或"浮点"。

希望这能有所帮助。

是的,本地化。

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

要修复:第一个不要在c#代码中使用FLOAT,除非您绝对需要浮点数字。请改用小数类型。这不仅仅是在这种情况下,而是在所有情况下。浮点数字是二进制的(以2为基础(,而不是十进制的(以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"必须是一个字符串,因此您可能必须对该数据库结果集的字段执行".ToString(("。

如果你最终不得不处理货币领域的其他"货币"方面,比如货币符号,请查看:http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx

如果您需要更健壮的错误处理,请输入小数。在try/catch中进行分析,或者使用十进制。TryParse。

编辑--

如果你知道数据库设置为什么文化(实际上是国家(,你可以这样做:

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

我在Web应用程序中遇到过这样的问题。。。但我找到了解决方案,就像我在文本框中获取我的价格值一样。所以我有一个数据库附在上面。所以当你用文本框连接数据库时。。。右键单击文本框并单击"编辑数据绑定…"时。。。。因为你必须提供。。。。键入类似于绑定属性。。。。。{0:N2}

这只适用于web应用程序或网站。。。不适用于桌面应用程序。。。