C# 从DataTable强制转换可为空的十进制数

C# 从DataTable强制转换可为空的十进制数,c#,casting,datatable,nullable,C#,Casting,Datatable,Nullable,我有一个数据表。从该表中,我从一列中读取值,即typeof(decimal)。我试着把这个值转换成十进制?当值为null时,我得到一个异常。我这样试过: decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"]; //this thorws "Specified cast is not valid." Exception decimal? dec= myRdr["myValue"] == DBNull.Value ?

我有一个数据表。从该表中,我从一列中读取值,即typeof(decimal)。我试着把这个值转换成十进制?当值为null时,我得到一个异常。我这样试过:

decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"]; 
//this thorws "Specified cast is not valid." Exception

decimal? dec= myRdr["myValue"] == DBNull.Value ? null : (decimal?)myRdr["myValue"]; 
//this does NOT throw an Exception?? 

当使用SQLDataReader从SQL数据表读取数据时,我尝试了第二种解决方案,它没有出现任何问题。

如评论中所述,
DBNull.Value
null
不是一回事。所以当你写作时:

decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"]; 
您正在尝试这样做:

if(DBNull.Value == null)
{
    return null;
}
else
{
    return (decimal?)row["myRow"];
}
这是错误的,所以第二部分(在else中)

被执行。这会引发异常

但在第二种情况下:

if(DBNull.Value == DBNull.Value)
{
    return null;
}
else
{
    return (decimal?)row["myRow"];
}

为true,因此不会执行cast语句并返回null。

第二种方法是正确的方法。DbNull和null不相等。@dbugger:第一个是从DataTable读取的,第二个是从SQL数据库表读取的。DataTable中的null值是否也为DBNull?是的,将为。如果(myRdr[“myValue”]是DBNull),另一个语法将是
。是。如果从数据库馈送该表,它将具有DbNull值。
if(DBNull.Value == DBNull.Value)
{
    return null;
}
else
{
    return (decimal?)row["myRow"];
}