日期:2014-05-17  浏览次数:20859 次

“指定的转换无效。”,Why???
foreach (DataRow row in dtDatas.Rows)
  {
  MonitorDatasMonth data = new MonitorDatasMonth();
  double testone = double.Parse(row["01"].ToString());


double testtwo = (double)(row.Field<decimal?>("01"));
data.THD01 = (double)(row.Field<decimal?>("01") ?? 100);

问题:“double.Parse(row["01"].ToString())” 这样可以,但是“(double)(row.Field<decimal?>("01"))”这样就会提示“指定的转换无效。” 这是为什么呢???

什么叫做“指定的转换无效。”??? 另一个地方“data.THH00 = (double)(row.Field<decimal?>("00") ?? 100);” 这样就没有问题。

  }

------解决方案--------------------
你先打印出
row.Field<decimal?>("01")
看是什么

row["01"].ToString()
结果一样吗
------解决方案--------------------
首先,你的那个数据库字段要是可空的,你才可以用decimal?

其次,如果为空,你必须指定如果为空时,给与一个默认数值,否则如果为空的话,你double显示强制转换,当然会报错。

你想一个 double.Parse(null)这样的能编译通过嘛????


------解决方案--------------------
加个判断条件。判断是否为空。为空一个处理。不为空一个处理
------解决方案--------------------
因为row.Field<decimal?>("00")有可能返回了NULL
如果返回null的话,上一句代码就==(double)(null),当然报错了。。

row.Field<decimal?>("00") ?? 100

而这一句把null替换成100了
如果返回null的话,后一句转换相当于:(double)(100),正确。


row.Field<decimal?>("00") ?? 100
这句代码==

C# code
if(row.Field<decimal?>("00")==null)
{
    return 100;
}
else
{
   return row.Field<decimal?>;
}

------解决方案--------------------
LZ你需要理解
?? 运算符
A ?? B 的结果是:如果A为null,那么得到B,否则得到A
row.Field<decimal?> 返回一个 decimal?(等同Nullable<Decimal>) 值,如果对应的数据是DbNull那么会得到null,否则为一个decimal值。
row.Field<decimal?>("00") ?? 100 能保证表达式不为null,表达式返回一个decimal值

row.Field<decimal?>("00") 则可能为null,为一个decimal?值
可以从decimal强制转换为double但不能从decimal?转换
------解决方案--------------------
探讨

谢谢各位大师,

不明白原来这样写:double testthree = (double)(row.Field<decimal?>("01") ?? 100);
是没有问题的,现在咋么就报错了?

------解决方案--------------------
row.Field<decimal?>("01")
从DataTable中以decimal类型获取01这一列


就相当于
SqlDataReader sdr=new SqlDataReader();
sdr.GetDecimal(1);//如果数据库表中不是decimal的类型或者不是数字类型,这里会报错
一样的道理



------解决方案--------------------
转换之前先给个判断是否为空呗!
------解决方案--------------------
null怎么转换成 double