2013-02-25 50 views
0

我在C#中這個數據表結果鏈接錯誤的DBNull

Date Employee Job1 Job2 Job3 
1/1/2012 a 1  1  1 
1/1/2012 b   2  
1/1/2012 c 2  1  4 
1/1/2012 d 4  2  1 
1/2/2012 a 3  2  5 
1/2/2012 b 2  2  2 
1/2/2012 c 3  3  3 
1/2/2012 d 1  1  1 
1/3/2012 a 5  5  5 
1/3/2012 b 2  2  6 
1/3/2012 c   1  1 
1/3/2012 d 2  3  4 
2/1/2012 a 2  2  2 
2/1/2012 b 5  5  2 
2/1/2012 c 2  2  2 
2/2/2012 a   3  
2/2/2012 b 2  3  3 
3/1/2012 a 4  4  2 

爲了得到這樣的結果:

崗位1:

Employee  January  February   March 
A    9    5     4 
B    6    7 
C    6    2 
D    7 

LINQ的代碼是:

  var monthEmpGroups = tblEmpJobs.AsEnumerable() 
       .Select(r => new 
       { 
        Row = r, 
        Employee = r.Field<String>("Employee"), 
        Year = r.Field<DateTime>("Date").Year, 
        Month = r.Field<DateTime>("Date").Month 
       }) 
       .GroupBy(x => x.Employee); 

      DataTable tblMonthResultJob1 = new DataTable(); 
      tblMonthResultJob1.Columns.Add("Employee", typeof(string)); 
      var dtf = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat; 

      foreach (var empGroup in monthEmpGroups) 
      { 
       string employee = empGroup.Key; 
       var newRow = tblMonthResultJob1.Rows.Add(); 
       newRow["Employee"] = employee; 
       var empMonthGroup = empGroup.GroupBy(mg => new { mg.Year, mg.Month }); 

       foreach (var empYearMonthGroup in empMonthGroup) 
       { 
        int year = empYearMonthGroup.Key.Year; 
        int month = empYearMonthGroup.Key.Month; 
        string colName = string.Format("{0} {1}", dtf.GetMonthName(month), year); 
        if (!tblMonthResultJob1.Columns.Contains(colName)) 
         tblMonthResultJob1.Columns.Add(colName, typeof(int)); 
        int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int>("Job1")); 
        newRow[colName] = empJob1Count; 
       } 
      } 

關於此線:

int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int>("Job1")); 
I am getting error: {System.InvalidCastException: Cannot cast DBNull.Value to type 'System.int'. Please use a nullable type. 

任何人都可以建議如何解決這個問題。

回答

1

從數據庫返回的基礎值爲NULL,不能存儲在int中。

改爲使用可爲空的int。

int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int?>("Job1") ?? 0); 

編輯

@Phil是相當正確的。請參閱使用空合併運算符。當基礎值爲空時,它將使用0來代替(它對Sum的影響不大)。

+0

此狀態並沒有工作,當我寫這一行: INT empJob1Count = empYearMonthGroup.Sum(X => x.Row.Field ( 「作業1」)); 我收到錯誤:不能隱式轉換類型'int?'到'int'。顯式轉換存在(你是否缺少一個轉換?) 所以我使用這一行: int empJob1Count = Convert.ToInt(empYearMonthGroup.Sum(x => x.Row.Field (「Job1」))); 仍然收到相同的錯誤。 – user1254053 2013-02-25 11:32:16

+3

它應該是x => x.Row.Field (「Job1」)?? 0 – Phil 2013-02-25 12:00:33

+0

謝謝@Phil。我確實懷疑Sum是否足夠聰明,可以自動忽略空值。顯然不是! :) – 2013-02-25 12:11:12

0

檢查此

int empJob1Count = empYearMonthGroup.Where(x => x.Row["Job1"] != DBNull.value).Sum(x=>x.Row.Field<int>("Job1")); 
+0

沒有阿比,這也是行不通的。錯誤無法將[]用[]指定爲'AnonymousType#1'類型的表達式 - x [「Job1」] – user1254053 2013-02-25 11:40:25

+1

請檢查代碼現在...用x.Row [「Job1」]替換 – AbinZZ 2013-02-25 11:48:22