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);” 这样就没有问题。
}
{
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);” 这样就没有问题。
}
DataRow 中的字段:01 : 20.08333302 :NULL03: 20.58091
double testone = double.Parse(row["01"].ToString());这样写,对“01、03”是可以的,但是“02”为“Null”就不行。double testthree = (double)(row.Field<decimal?>("01") ?? 100);这样写应该适用于“01、02、03”啊,如果是“row.Field<decimal?>("XX")”为“NULL”,那么设为“100”,如果不为“NULL”,那么转化为“Double”。为什么提示“指定的转换无效。”??? 原来这样用没有问题的啊。
如果返回null的话,上一句代码就==(double)(null),当然报错了。。row.Field<decimal?>("00") ?? 100而这一句把null替换成100了
如果返回null的话,后一句转换相当于:(double)(100),正确。
row.Field<decimal?>("00") ?? 100
这句代码==if(row.Field<decimal?>("00")==null)
{
return 100;
}
else
{
return row.Field<decimal?>;
}
是没有问题的,现在咋么就报错了?
?? 运算符
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?转换
?? 100 如果为“decimal?”,会被转化为“100”,一样可以做“double”强制类型转化啊。
说明01这一列在Datatable中的类型不是一个decimal的类型或者不是数字类型,你看一下。通常来说:double testthree = (double)(row.Field<decimal?>("01") ?? 100);
这样写是非常正确的。
从DataTable中以decimal类型获取01这一列
就相当于
SqlDataReader sdr=new SqlDataReader();
sdr.GetDecimal(1);//如果数据库表中不是decimal的类型或者不是数字类型,这里会报错
一样的道理