2013-10-31 76 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();