【问题标题】:Null value from SQL datareader not evaluating as expected来自 SQL 数据读取器的空值未按预期进行评估
【发布时间】:2015-03-11 00:17:47
【问题描述】:

阅读了很多关于 null、DBNull 等的内容,感觉我明白了这些概念,但显然我没有。

我正在查询一个 SQL Server 数据库表,并且有一个允许为空的列。

我将查询结果放入数据集中,我可以清楚地看到相关行的值似乎是 NULL,但它在 DataSet Visualizer 中看起来只是“空白”。该列在相关行的 SQL Server 表中肯定是 NULL,而我的选择查询是直接选择语句(即我的 SQL 中没有使用 isnull 代码)。

我试图解决这个看似简单的问题,但我对空值的测试一直将值视为非空值。但是我的代码跳到 else 部分并尝试转换 pct cancelled 列中的值并不断给我一个错误 Convert.ToDouble

对象不能从 DBNull 转换为其他类型。

我尝试过使用_cancelledPct 列上的数据类型,但似乎没有任何帮助。我觉得我错过了一些非常明显的东西,但无法弄清楚为什么我 99.9999% 确定为 null 的这个值在我的 System.DBNull.Value 部分中没有进行评估(注意我也尝试过 dr["pct cancelled"] == null并得到了相似的结果)。

if (dr["pct cancelled"] != System.DBNull.Value)                    
    this._cancelledPct = 0; 
else
    this._cancelledPct = Convert.ToDouble(dr["pct cancelled"]); 

更新:

这是我的数据读取器和数据行的设置方式:

DataRow dr = dimCampaignSplitRow;
SqlCommand cmd = new SqlCommand();
cmd.Connection = _etlTask.Job.CrsConnection;
cmd.CommandTimeout = 1800;
SqlDataReader theDr = null;
SqlDataAdapter da = null;

【问题讨论】:

    标签: c# sql-server null converter dbnull


    【解决方案1】:

    看来你的情况发生了逆转。

    //Changed from != to ==
    if (dr["pct cancelled"] == System.DBNull.Value)                    
        //If it is null, 0
        this._cancelledPct = 0; 
    else
        //If not, convert
        this._cancelledPct = Convert.ToDouble(dr["pct cancelled"]); 
    

    【讨论】:

    • 谢谢 mlorbetske,我认为你是对的。但是,在修复之后,我仍然得到相同的“无法投射对象...”错误。
    【解决方案2】:

    您可以通过调用.IsDBNull() 方法来询问SqlDataReader,如下所示:

    if (dr.IsDBNull(dr.GetOrdinal("pct cancelled"))
       this._cancelledPct = 0; 
    else
       this._cancelledPct = Convert.ToDouble(dr["pct cancelled"]); 
    

    【讨论】:

    • marc_s,我在 VS2008 中使用 C# 并且 isDBNull 似乎不存在(我确实将 IsNull 作为一个选项)并且 GetOrdinal 也没有显示为有效。您是否很好地使用 C#,或者可能是我的数据读取器的设置与我应该设置的方式不同。
    • @RyanWard:啊-抱歉-您有dr,但不是SqlDataReader(我从命名中怀疑)而是DataRow-.IsDBNull()方法存在于@ 987654328@ - 所以theDr.IsDBNull(....) 应该可以工作
    • marc_s,刚刚弄清楚我的代码有多么误导(在我的其他代码中,博士 99% 是针对数据读取器的,所以我什至自己都糊涂了)。在上面发布了答案,感谢您为我指明正确的方向
    【解决方案3】:

    实际上感谢 marc_s 和 mlorbetske 让我走上了正轨。事后看来,我认为我只需要睡个好觉。根据 mlorbetske 的帖子修复我的代码,然后查看 marc_s 的建议,我想出了这个,它有效。我只需要在有问题的字段上做一个 Convert.IsDBNull 。

    星期二晚上有 2 个小时我再也回不来了,哈哈。再次感谢。

    if (Convert.IsDBNull(dr["pct cancelled"]))
        this._cancelledPct = 0;  
    else
        this._cancelledPct = Convert.ToDouble(dr["pct cancelled"]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2014-04-15
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 2015-09-03
      相关资源
      最近更新 更多