4

我正在使用下面的代码并尝试按货币和代码分组。在此之后,我试图遍历结果集。

但问题是在遍历结果时,最后我在 for each 语句中得到以下异常:

对象不能从 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());
    }

请帮我解决这个问题。

4

4 回答 4

4

就像是

 amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"] == DBNull.Value ? 0 : x["AMOUNT"]));

如果那是给您带来问题的那条线。

于 2013-10-31T16:37:57.373 回答
1

这个:

amount = grp.Sum(x => Convert.ToDouble(x["AMOUNT"]))

不会像你期望的那样工作。如果x["AMOUNT"]isDBNull.Value而不是 valid double,则转换将失败并出现异常。相反,请尝试:

amount = grp.Sum(x.Field<double?>("AMOUNT"))

如果您希望该字段为double. 根据MSDNSumnull值视为零。

于 2013-10-31T16:32:37.287 回答
1

使用 DBNulls 查找特定列的 CELLS 数量的方法:

int numOfEmptyColA = MyDataTable.AsEnumerable().Where(p=>p.IsNull("ColA")).Count();
于 2017-01-09T07:51:55.070 回答
0

我不确定是哪一个收到了错误,但您可以将其与DBNull.Value这样的情况进行比较。

String sCurr = obj.currency == DBNull.Value ? "" : obj.currency;
于 2013-10-31T16:22:58.677 回答