2013-10-31 54 views
2

我正在使用下面的代码并尝试按货币和代码进行分组。在此之后,我试图循环遍历结果集。如何检查Linq查询结果中的DBNull值

但问题是,同时通过循环的结果,到了最后我得到下面的异常的每条语句:

对象不能从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

是量的实际双重价值,或双的字符串表示? – Servy

回答

2

喜欢的东西

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

如果这是给你的问题就行了。

+0

内置的Field扩展方法将处理'DBNull.Value'很好,如果你给它一个'Nullable <>'类型参数,所以你不需要手动检查'DBNull.Value'。相反,你可以处理一个普通的C#'null',它可以让你使用'??'操作符来获得更简洁的代码。 –

+0

Thnaks Sam Ward,问题在于转换,它也由Thom Smith提及。 – Ullan

0

我不确定哪一个出现错误,但您可以将它与DBNull.Value这样比较。

String sCurr = obj.currency == DBNull.Value ? "" : obj.currency; 
+0

上面的代码给出了一个编译错误,比如“不能应用于字符串类型的操作数'到'System.DBNull' – Ullan

+0

然后它可能是数量字段,我不确定哪个错误发生,所以尝试添加它到'obj.amount'表达式,并从另外两个中删除它。 – Smeegs

+0

'string amount = obj.currency == DBNull.Value?“”:obj.amount.ToString();' – Smeegs

1

此:如您所愿

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

将无法​​正常工作。如果x["AMOUNT"]DBNull.Value而不是有效的double,转换将失败,并出现异常。相反,尝试:

量= grp.Sum(x.Field( “金额”))

如果你希望该字段是一个doubleSum将按照MSDNnull的值视为零。

+0

感谢Thom Smith,转换引起了问题 – Ullan

0

发现细胞与DBNulls特定列数的方法:

int numOfEmptyColA = MyDataTable.AsEnumerable().Where(p=>p.IsNull("ColA")).Count();