繁体   English   中英

从DataReader解析十进制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM