SQL datareader的空值未按预期进行评估

时间:2015-03-11 00:17:48

标签: c# sql-server null converter dbnull

阅读很多关于null,DBNull等等的内容,感觉我得到了概念,但显然我不是。

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

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

我试图解决这个看似简单的问题,但我对空值的测试仍然将值视为不为空。但是,我的代码会跳到其他部分并尝试转换pct cancelled列中的值并继续向我发送Convert.ToDouble

错误
  

无法将对象从DBNull强制转换为其他类型。

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

dr["pct cancelled"] == null

更新:

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

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

3 个答案:

答案 0 :(得分:3)

看起来你的状况已被翻转。

//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"]); 

答案 1 :(得分:0)

您可以通过以下方式调用SqlDataReader方法来询问.IsDBNull()

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

答案 2 :(得分:0)

实际上,多亏了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"]);