从DataTable中转换可为空的十进制数

时间:2014-02-06 22:26:24

标签: c# casting datatable nullable

我有一个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数据表中读取时尝试了第二个解决方案,并且没有任何问题。

1 个答案:

答案 0 :(得分:2)

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

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。