我使用以下代码并尝试按货币和代码分组。在此之后,我试图遍历结果集。
但问题是在循环结果时,最后我在每个语句中得到以下异常:
无法将对象从DBNull强制转换为其他类型。
DataTable dt = new DataTable();
var result = from r in dt.AsEnumerable()
result r by new
{
currency = r.Field<String>("CURRENCY"),
Code = r.Field<String>("CODE")
}
into grp
select new
{
currency = grp.Key.currency,
Code = grp.Key.Code,
amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"]))
};
foreach (var obj in result)
{
String sCurr =obj.currency;
String Code = obj.Code;
string amount= obj.amount.ToString());
}
请帮我解决此问题。
答案 0 :(得分:2)
像
这样的东西 amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"] == DBNull.Value ? 0 : x["AMOUNT"]));
如果那是给你问题的那一行。
答案 1 :(得分:1)
此:
amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"]))
无法按预期工作。如果x["AMOUNT"]
为DBNull.Value
而不是有效double
,则转换将失败并出现异常。相反,尝试:
amount = grp.Sum(x.Field(“AMOUNT”))
如果您希望该字段为double
。 Sum
会将null
值视为零,每MSDN。
答案 2 :(得分:0)
我不确定哪一个会收到错误,但您可以将其与DBNull.Value
进行比较。
String sCurr = obj.currency == DBNull.Value ? "" : obj.currency;
答案 3 :(得分:0)
查找特定列的DBNull的CELLS数量的方法:
int numOfEmptyColA = MyDataTable.AsEnumerable().Where(p=>p.IsNull("ColA")).Count();