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
。。。
这是某种本地化问题。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应用程序或网站。。。不适用于桌面应用程序。。。