从DataReader解析小数

时间:2009-09-01 15:42:02

标签: c# parsing decimal sqldatareader

我找到了这个错误的解决方法,但我现在真的很好奇为什么会发生这种情况,想知道是否有其他人有这个错误。

我的功能如下:

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。

5 个答案:

答案 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");
}

我打赌这确实会抛出......