我有一个DataTable表。从该表我读取一列的值,其类型为(十进制)。我尝试将此值转换为十进制? (分解)。当value为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数据表中读取时尝试了第二个解决方案,并且没有任何问题。
答案 0 :(得分:2)
如评论中所述,DBNull.Value
和null
不是一回事。所以当你写作时:
decimal? dec= row["myRow"] == null ? null : (decimal?)row["myRow"];
你正在尝试这样做:
if(DBNull.Value == null)
{
return null;
}
else
{
return (decimal?)row["myRow"];
}
这是假的所以第二部分(在其他地方)
(decimal?)row["myRow"];
已执行。这引发了异常。
但在第二种情况下:
if(DBNull.Value == DBNull.Value)
{
return null;
}
else
{
return (decimal?)row["myRow"];
}
为true,因此不执行cast语句并返回null。