[英]Parsing a decimal from a DataReader
我找到了解决此错误的方法,但现在真的很奇怪为什么会发生这种情况,我想知道是否还有其他人遇到此错误。
我的功能如下:
public void Blog_GetRating(int blogID, ref decimal rating, ref int voteCount)
{
// Sql statements
// Sql commands
if (DataReader.Read())
{
// this line throws a 'Input string was not in a correct format.' error.
rating = decimal.Parse(DataReader["Rating"].ToString());
// this works absolutly fine?!
decimal _rating = 0;
decimal.TryParse(DataReader["Rating"].ToString(), out _rating);
rating = _rating;
}
}
有人看过吗?
更奇怪的是,如果我输入以下内容:
rating = decimal.Parse("4.0");
可以正常工作,4.0是我的DataReader推出的。
正如我之前所说,TryParse方法可以正常工作,因此不会阻止我继续前进,但是现在我真的很想知道是否有人对此有答案。
期待一些答复!
肖恩
编辑-解决
decimal.Parse方法运行良好,第二次运行该函数(处于循环状态),未对帖子进行评级,因此数据读取器返回空值。 在SQL中将COALESCE包装起来可以很好地解决问题。 因此,如您所说,为什么tryparse方法没有引发异常,而只将默认值0保留为_rating。
这一点对我来说似乎并不奇怪。
Decimal.Parse()
应该为格式错误引发异常。 Decimal.TryParse()
不会引发该异常,而只是返回false。 更重要的是, 您没有检查Decimal.TryParse()
的返回值。 我会给您带来真正的好机会,即Decimal.TryParse()
对于导致Decimal.Parse()
导致异常的每个输入返回false,而在其他所有地方都为true。 当Decimal.TryParse()
返回false时,输出参数始终仅为“ 0”。
一种可能的警告是本地化。 如果Decimal.Parse()
抱怨看似正常的输入,则可以检查服务器上使用的数字格式(当前区域性)是否使用逗号而不是十进制来将系数与尾数区分开。 但是鉴于您的“ 4.0”测试效果很好,我怀疑这是问题所在。
最后,从数据读取器执行此转换时,应考虑数据读取器的源列类型。 如果可能已经是小数。 为什么将其转换为仅将其转换回字符串的字符串?
你是这样说的:
// this works absolutly fine?!
decimal _rating = 0;
decimal.TryParse(DataReader["Rating"].ToString(), out _rating);
但是您实际上并没有检查TryParse的返回值。 我想您的TryParse实际上会失败(返回false),因为给定您正在使用的重载,decimal.Parse和decimal.TryParse使用相同的“规则”进行解析。
我怀疑它们都没有按照您的想法工作。 两者都可能失败,但是TryParse不会抛出。
sql十进制列不会解析为可以转换为Decimal的字符串,因此tryparse将返回false。 尝试这样的事情:
if (Convert.IsDBNull(reader["DecimalColumn"]))
{
decimalData = 0m;
}
else
{
decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
}
我今天也面临着同样的问题。 尝试这个:
rating = decimal.Parse("4,0");
它会给你同样的错误。
这背后的原因是文化。 在法国文化中,4.0表示为4,0,因此会引发Exception。
decimal.TryParse
是区域性不变方法,因此您可以正常使用。
将您的TryParse更改为此,然后再试一次:
if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
{
throw new Exception("Input string was not in a correct format");
}
我敢打赌这确实会抛出...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.