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

时间:2012-06-26 14:11:09

标签: c# datarow

当我的网站获得以下代码时,它会出现如下例外情况:

  

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

为了简洁起见,我只显示相关代码(这是我给出的4000+ LOC文件)。

if (dr["STAGE"] is DBNull)
{
    dto.Stage = 1; // This is the line throwing the exception, according to stack trace
}
else
{
    dto.Stage = Convert.ToInt32(dr["STAGE"]);
}

这里,dr是一个DataRow对象,它是对数据库进行查询的结果,dto是一个基本类,只保存一些属性,其中dto.Stage是{ {1}}成员。

我已经查看了其他问题,并显示了相同的错误消息,但大多数似乎都建议“检查它是否为DBNull”,我已经在做了。

那么有人可以提出解决方案吗?

5 个答案:

答案 0 :(得分:4)

使用==代替is

if (dr["STAGE"] == DBNull.Value)
{

}

答案 1 :(得分:2)

使用这种稍微更有效的方法

int stageOrdinal = dr.GetOrdinal("STAGE");
while (dr.Read()) {
     dto = new DataTransferObject();
     if (dr.IsDBNull(stageOrdinal)) {
         dto.Stage = 1;
     } else {
         dto.Stage = dr.GetInt32(stageOrdinal);
     }
     //TODO: retrieve other columns.
     dtoList.Add(dto);
}

按索引访问列比按名称访问列更快。可以使用GetOrdinal的{​​{1}}方法检索列的索引。这最好在循环之前完成。

答案 2 :(得分:1)

请改用System.Data.DataRow.IsNull功能。

if(dr.IsNull("Stage"))
{
 ...
}

答案 3 :(得分:0)

以下是可以为空的数据类型的示例,您可以使用它来避免DBNull错误。 以下示例不是您所遇问题的真正解决方案,而是您如何解决问题的一个示例。把它想象成学习捕鱼,而不是给鱼。

我从http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

取出了这个
class NullableExample
{
    static void Main()
    {
        int? num = null;
        if (num.HasValue == true)
        {
            System.Console.WriteLine("num = " + num.Value);
        }
        else
        {
            System.Console.WriteLine("num = Null");
        }

        // y is set to zero
        int y = num.GetValueOrDefault();

        // num.Value throws an InvalidOperationException if num.HasValue is false
        try
        {
            y = num.Value;
        }
        catch (System.InvalidOperationException e)
        {
            System.Console.WriteLine(e.Message);
        }
    }
}

答案 4 :(得分:0)

@MarcGravell在评论中有权利:

  

忽略堆栈跟踪中的确切行号;数字可以   稍微偏离 - 我一直都在看。在调试器中运行它   换句话说,或者只是在钉住它时添加额外的日志记录

<@> @谢尔盖的回答是完全错误的。