【问题标题】:Parsing a DBNULL value into double将 DBNULL 值解析为 double
【发布时间】:2017-09-28 19:53:40
【问题描述】:

我使用以下行将datarow 值转换为双精度值。

double.parse(Convert.ToString(datarow));

如果datarowDBNULL,我会收到以下异常:

'double.Parse(Convert.ToString(data))' 抛出 'System.FormatException'

类型的异常

不使用tryparse.如何处理这个问题

【问题讨论】:

  • 在您的查询中确保没有 dbnull。你用的是什么服务器?
  • 参考w3schools.com/sql/sql_isnull.asp,使用SQL检查空值的方法。
  • 你想要发生什么?
  • 对于空行我想得到 0

标签: c# sql parsing dbnull formatexception


【解决方案1】:

另一种方法是检查datarow 是否为DBNull

double d = datarow is DBNull ? 0 : double.Parse(Convert.ToString(datarow));

这样,您就不需要检查DBNull.Value

【讨论】:

    【解决方案2】:

    DBNull 不能转换或解析为double(或intdecimal 等),因此您必须在尝试解析之前检查datarow 是否为DBNull。它应该是使用三元运算符的单线:

    doubleValue = datarow == DBNull.Value ? 0.0 : double.Parse(Convert.ToString(datarow));
    

    【讨论】:

    • 可能括号顺序不同
    • 错误是必须将结果分配给变量
    【解决方案3】:

    我有一堆针对此类场景的转换实用方法,格式与此类似。

    // tries to convert a general object to double, if a defaultValue is provided, it will silently fall back to it, if not, it will throw exceptions
    public static double ToDouble(object obj, double? defaultValue = null) {
      if (obj == null || obj == "" || obj == DBNull.Value) return 0.0;
      try {
        if (obj is string)
          return double.Parse((string)obj);
        return Convert.ToDouble(obj);
      } catch {
        if (defaultValue != null) return defaultValue.Value;
        throw;
      }
    }
    

    我主要在使用 ADO.NET 或其他弱类型接口(例如从 Excel 读取数据)时使用这种从弱到强的类型转换实用程序。

    在我的真实代码中,我还允许传递 CultureInfo 以进行字符串转换,并执行一些其他操作,例如规范化十进制符号等,以实现最佳格式容差。

    一般的 catch 子句当然可以通过捕获特定的异常类型(如 FormatException)来改进,但根据我的需要,它工作得很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      相关资源
      最近更新 更多