【问题标题】:How to handle DBNull exception for multiple values如何处理多个值的 DBNull 异常
【发布时间】:2019-07-12 21:06:14
【问题描述】:

我正在为模型赋值。其中一些值可以为空。我尝试了几种方法来处理 DBNull 值,但仍然出现错误

 dPbtbud.Xfer = dataFromFile.Tables[0].Rows[i][j++] == DBNull.Value ? 
      0.0 : 
      Convert.ToDouble(dataFromFile.Tables[0].Rows[i][j++]);

也试过了

 dPbtbud.Xfer = dataFromFile.Tables[0].Rows[i][j++] is DBNull ? 
     0.0 : 
     Convert.ToDouble(dataFromFile.Tables[0].Rows[i][j++]);

似乎不处理空值

【问题讨论】:

  • 你试过了吗:dataFromFile.Tables[0].Rows[i][j++] == null
  • @Stefan 是的,刚刚尝试过。得到相同的错误“对象不能从 DBNull 转换为其他类型”
  • 这些数据是从哪里来的?看起来它是从文件中读取的。是字符串数据吗?应该是string.IsNullOrWhiteSpace(dataFromFile.Tables[0].Rows[i][j++]) ? 0.0 : ..
  • 除非它的值是实际的"NULL""NILL" 或类似的东西。
  • 您意识到j++ 最多执行两次,对吧?因此,当它不为空时,您正在获取下一行(现在可能为空)。

标签: c# sql asp.net .net


【解决方案1】:

我的建议是创建一个扩展方法来检查 null 和 DBNull :

namespace Helper
{
 public static class ConvertEX1
    {
        public static object IsNull<T>(this object obj, T def) where T : struct
        {
            if (obj == null || obj == DBNull.Value)
                return (T)Convert.ChangeType(def, typeof(T));
            return (T)Convert.ChangeType(obj, typeof(T));
        }
    }
}

不要忘记在您使用函数的每个 .cs 文件中导入命名空间:

using Helper;
...


dPbtbud.Xfer = (double)dataFromFile.Tables[0].Rows[i][j++].IsNull(0.0);

【讨论】:

  • 这个扩展对于 OP 来说是多余的,DataRow 已经有扩展方法.Field&lt;T&gt; 会返回正确的类型。
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多