gpt4 book ai didi

c# - 从 DataReader 解析小数

转载 作者:太空狗 更新时间:2023-10-29 20:57:54 25 4
gpt4 key购买 nike

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

我的函数如下:

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”测试运行良好,我怀疑这是问题所在。

最后,当从数据阅读器进行这种转换时,您应该考虑数据阅读器的源列类型。如果可能已经是小数。为什么只将它转换为字符串再将其转换回来?

关于c# - 从 DataReader 解析小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1363185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com