代码之家  ›  专栏  ›  技术社区  ›  royse41

从数据读取器分析十进制

  •  6
  • royse41  · 技术社区  · 16 年前

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

    我的功能如下:

    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是我的数据阅读器的输出。

    正如我之前所说,台盼色法工作得很好,所以它不会阻止我携带,但现在我真的很感兴趣,看看是否有人对此有答案。

    期待回复!

    肖恩

    编辑解决

    decimal.parse方法工作正常,函数第二次运行(在循环中)时,没有为post评级,因此数据读取器返回了一个空值。在SQL中包装coalesce可以很好地解决这个问题。因此,正如您所说,Tryparse方法并没有抛出异常,只是将默认值保持为0到\u。

    5 回复  |  直到 10 年前
        1
  •  11
  •   Joel Coehoorn    16 年前

    我一点也不觉得奇怪。

    Decimal.Parse() 想象上的 为错误格式引发异常。 Decimal.TryParse() 不会抛出该异常,而是返回false。更重要的是 您没有检查返回值 十进制.typarse()) . 我会给你很好的机会 十进制.typarse()) 对于导致异常的每个输入返回false decimal.parse()。 其他地方都是如此。什么时候 十进制.typarse()) 返回false,输出参数总是“0”。

    一个可能的警告是本地化。如果 decimal.parse()。 抱怨输入看起来很正常,您可以检查服务器上使用的数字格式(当前区域性)是否使用逗号而不是小数来分隔系数和尾数。但考虑到你的“4.0”测试运行良好,我怀疑这是问题所在。

    最后,在从数据读取器进行此转换时,您应该考虑数据读取器的源列类型。如果可能已经是小数。为什么要将其转换为字符串而只转换回字符串?

        2
  •  2
  •   Reed Copsey    16 年前

    你说的是:

        // this works absolutly fine?!
        decimal _rating = 0;
        decimal.TryParse(DataReader["Rating"].ToString(), out _rating);
    

    但实际上你没有检查胰蛋白酶的返回值。我猜你的函数实际上失败了(返回false),因为decimal.parse和decimal.tryparse使用相同的“规则”来解析,前提是你使用的重载。

    我怀疑两者都没有你想的那样有效。两个都可能失败了,但台盼斯不会扔。

        3
  •  1
  •   TheEmirOfGroofunkistan    13 年前

    SQL十进制列不会解析为可以转换为十进制的字符串,因此Trparse将返回false。尝试如下操作:

     if (Convert.IsDBNull(reader["DecimalColumn"]))
         {
            decimalData = 0m;
         }
         else
         {
            decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
         }
    
        4
  •  1
  •   msrd0 Gordon Linoff    10 年前

    我今天也面临同样的问题。 试试这个:

    rating = decimal.Parse("4,0");
    

    它会给你同样的错误。


    这背后的原因是文化。在法国文化中,4.0表示为4.0,因此它抛出了一个异常。

    decimal.TryParse 是文化不变的方法,因此它对您很好。

        5
  •  0
  •   Dan Diplo    16 年前

    将您的胰蛋白酶更改为此并重试:

    if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
    {
      throw new Exception("Input string was not in a correct format");
    }
    

    我敢打赌这肯定会引发…

    推荐文章