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);”   这样就没有问题。

                    }

解决方案 »

  1.   

    本帖最后由 net_lover 于 2012-10-12 10:20:47 编辑
      

  2.   

    首先,你的那个数据库字段要是可空的,你才可以用decimal?其次,如果为空,你必须指定如果为空时,给与一个默认数值,否则如果为空的话,你double显示强制转换,当然会报错。你想一个 double.Parse(null)这样的能编译通过嘛????
      

  3.   

    各位大师,请看一下结果集。
    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”。为什么提示“指定的转换无效。”???    原来这样用没有问题的啊。
      

  4.   

    因为row.Field<decimal?>("00")有可能返回了NULL
    如果返回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?>;
    }
      

  5.   

    string value=row.Field<decimal?>("01")==DBNULL.Value?"":row.Field<decimal?>("01");
      

  6.   

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

  7.   

    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?转换
      

  8.   


     ?? 100   如果为“decimal?”,会被转化为“100”,一样可以做“double”强制类型转化啊。
      

  9.   


    说明01这一列在Datatable中的类型不是一个decimal的类型或者不是数字类型,你看一下。通常来说:double testthree = (double)(row.Field<decimal?>("01") ?? 100);
    这样写是非常正确的。
      

  10.   

    row.Field<decimal?>("01")
    从DataTable中以decimal类型获取01这一列
    就相当于
                SqlDataReader sdr=new SqlDataReader();
                sdr.GetDecimal(1);//如果数据库表中不是decimal的类型或者不是数字类型,这里会报错
    一样的道理