2013-02-25 2 views
0

У меня есть этот DataTable результат в 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 

Чтобы получить этот результат:

Job1:

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.

Используйте вместо этого значение nullable int.

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

EDIT

@Phil было совершенно правильно. См. Использование оператора нулевой коалесценции. Когда базовое значение равно null, оно вместо этого будет использовать 0 (что не должно влиять на вашу сумму).

+0

Это IsNot работает, когда я писал эту строку: INT empJob1Count = empYearMonthGroup.Sum (х => x.Row.Field ("Job1")); Я получаю сообщение об ошибке: Невозможно неявно преобразовать тип 'int?' to 'int'. Явное преобразование существует (вы пропускаете листинг?) , поэтому я использовал эту строку: int empJob1Count = Convert.ToInt (empYearMonthGroup.Sum (x => x.Row.Field ("Job1"))); все еще получают ту же ошибку. – user1254053

+3

он должен быть x => x.Row.Field ("Job1") 0 – Phil

+0

Спасибо @Phil. Я действительно задавался вопросом, была ли Sum достаточно умен, чтобы автоматически игнорировать нулевые значения. Ясно, нет! :) –

0

проверить это

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

Нет, Аби, это тоже не работает. Ошибка Невозможно применить индексирование с [] к выражению типа «Анонимный тип №1» - x [«Job1»] – user1254053

+1

Пожалуйста, проверьте код сейчас. Замените его x.Row ["Job1"] – AbinZZ