2016-07-27 81 views
2

我不明白为什么“指定的转换无效异常”这里时抛出“指定的转换无效”在lambda表达式异常抛出时达到m.HadapGoalPercent财产,我tryed也改变x => x.Field<float>("HadapGoalPercent")的数据类型为单,双,但它不工作查询浮现场

for (int i = 0; i < dt.Rows.Count; i++) 
        { 
         Sales.Month m = new Sales.Month(Yearnum, (byte)(i+1)); 
         m.HadapGoal = dt.AsEnumerable().Where(x => x.Field<int>("MonthNum") == i + 1).Select(x => x.Field<int>("HadapGoalIncome")).Single(); 
         m.ShotefGoal = dt.AsEnumerable().Where(x => x.Field<int>("MonthNum") == i + 1).Select(x => x.Field<int>("ShotefGoalIncome")).Single(); 
         m.HadapGoalPercent = dt.AsEnumerable().Where(x => x.Field<int>("MonthNum") == i + 1).Select(x => x.Field<float>("HadapGoalPercent")).SingleOrDefault(); 
         m.ShotefGoalPercent = dt.AsEnumerable().Where(x => x.Field<int>("MonthNum") == i + 1).Select(x => x.Field<float>("ShotefGoalPercent")).SingleOrDefault(); 
         months.Add(m); 
        } 

这就是定义月类内的ShotefGoalPercentHadapGoalPercent属性:

public Single ShotefGoalPercent { get; set; } 
public Single HadapGoalPercent { get; set; } 

这就是dt的数据表:

(HadapGoalPercent和ShotefGoalPercent被定义为在SQL数据库十进制(5,4))

dt Datatable Image

非常感谢您的时间和considiration

+0

你有没有尝试铸造到十进制?毕竟,你说它以小数点的形式存储在数据库中。 – sr28

+0

查看'dt.Columns [“HadapGoalPercent”] .DataType'属性。它应该告诉你你需要使用哪些演员。 –

+0

好的...感谢@ sr28问题解决了我已经改变了HadapGoalPercent,ShotefGoalPercent从单一到十进制以及查询中的数据到十进制也......它的工作。这里是我现在发现的关于decimal,float,single和double的区别的线程:http://stackoverflow.com/questions/618535/difference-between-decimal-float-and-double-in-net。为什么不把它写成答案? - 再次感谢 – jonathana

回答

1

根据我的评论,我不知道你为什么不只是铸造一个小数,因为这是你已经存储在数据库中。但是,如果你真的想这是一个双重你可以尝试:

Convert.ToDouble(value) 

随着你在你路过应该罚款小数的大小。如果输入的数字非常大,则会有失去精度的风险,但正如我所说的,我认为这不会成为您的问题。