我找到了这个错误的解决方法,但我现在真的很好奇为什么会发生这种情况,想知道是否有其他人有这个错误。
我的功能如下:
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。
答案 0 :(得分:11)
对我来说这看起来并不奇怪。
Decimal.Parse()
假设为坏格式抛出异常。 Decimal.TryParse()
不会抛出该异常,而是返回false。踢球者你没有检查Decimal.TryParse()
的返回值。我会给你真正的好机会,Decimal.TryParse()
对每个导致异常的输入都返回false Decimal.Parse()
,其他地方也是如此。当Decimal.TryParse()
返回false时,输出参数始终只是“0”。
一个可能的警告是本地化。如果Decimal.Parse()
抱怨看似正常的输入,您可以检查服务器上使用的数字格式(当前文化)是否使用逗号而不是小数来将系数与尾数分开。但鉴于你的“4.0”测试工作正常,我怀疑这是问题。
最后,在从数据读取器进行此转换时,您应该考虑数据读取器的源列类型。如果可能已经是小数。为什么只将它转换为字符串才能将其转换回来?
答案 1 :(得分:2)
你这么说:
// this works absolutly fine?!
decimal _rating = 0;
decimal.TryParse(DataReader["Rating"].ToString(), out _rating);
但是你实际上没有检查TryParse的返回值。我猜你的TryParse实际上是失败的(返回false),因为在给定你正在使用的重载的情况下,decimal.Parse和decimal.TryParse使用相同的“规则”进行解析。
我怀疑你的想法都没有奏效。两者都可能失败,但TryParse不会抛出。
答案 2 :(得分:1)
sql十进制列不会解析为可以转换为Decimal的字符串,因此tryparse将返回false。尝试这样的事情:
if (Convert.IsDBNull(reader["DecimalColumn"]))
{
decimalData = 0m;
}
else
{
decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
}
答案 3 :(得分:1)
我今天面临同样的问题。 试试这个:
rating = decimal.Parse("4,0");
它会给你同样的错误。
背后的原因是文化。在法国文化中,4.0表示为4,0,因此它抛出异常。
decimal.TryParse
是文化不变的方法,因此它可以正常工作。
答案 4 :(得分:0)
将TryParse更改为此,然后重试:
if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
{
throw new Exception("Input string was not in a correct format");
}
我打赌这确实会抛出......