2016-01-11 3 views
1

У меня есть консольное приложение, которое выполняется ежедневно, чтобы обновить мою базу данных.C#/ADO.NET - Пропуск строк при использовании SetField в datatable?

Каждый день приложение извлекает все данные Билета в файл данных.

В этом конкретном случае я пытаюсь рассчитать, был ли каждый билет в базе данных, который также не ответил, прошел максимальное время отклика, выделенное для этого билета (в часах). Дата сообщения о билете против сегодняшней даты.

Если время ответа прошло, значение 0 (false) устанавливается в столбце Response_met, else 1 (true).

Когда новые билеты добавляются в базу данных, их Response_Met изначально имеет значение NULL, пока это обновление не запущено и не подсчитает, прошло или нет response_time.

Это данные, относящиеся к udpate.

enter image description here

Выделенная ячейка в настоящее время NULL. После обновления он должен измениться на 0 (false), так как Max_response_time равно 1.00 HOUR, а билет был отправлен в 2014 году и не имеет response_time.

Это дата после обновления, она hasent изменена.

enter image description here

Их несколько экземпляров этого происходит в DataTable, я просто показываю первый экземпляр здесь.

Может ли кто-нибудь сказать, где проблема? Почему некоторые строки пропускаются и остаются после NULL после обновления? Он работает для большинства строк, за исключением нескольких из них. Ниже приведен код обновления, который я написал.

using (SqlCommand cmd2 = new SqlCommand("SELECT INCIDENT_NO, Report_DT, MIN(theStart) as The_Start, RESPONSE_TIME, Response_met, max_response_time FROM Ticket_REPORT rr left JOIN TimeTracker ON Incident_NO=theTask where theStart is null and impact like '3%' or theStart is null and impact like '4%' GROUP BY INCIDENT_NO, Report_DT,RESPONSE_TIME,Response_met,MAX_RESPONSE_TIME", sqlConn)) 
      { 
       var calc = new Calculation(holidays, new OpenHours("09:00;17:00"));//Calculates business hours 
       SqlDataAdapter da2 = new SqlDataAdapter(cmd2); 
       dtResponse.Clear(); 
       da2.Fill(dtResponse); 

       foreach (DataRow row in dtResponse.Rows) 
       { 
        var reportDT = row.Field<string>(dtResponse.Columns[1]); 
        //Check if business hours have passed alloted response time 
        if (TimeSpan.FromMinutes(calc.getElapsedMinutes(DateTime.Parse(reportDT), DateTime.Now)).TotalHours > (double)row.Field<decimal>(dtResponse.Columns[5])) 
        { 
         row.SetField(dtResponse.Columns[4], 0); 
        } 
       } 
       da2.Dispose(); 
      } 

ответ

0

Вы должны позвонить da2.Update(dtResponse) на самом деле обновления базы данных, в противном случае вы просто меняете DataRow RowState

+0

Обновление isent базы данных действительно вопрос, что я делаю, что в другом месте в коде. Проблема заключается в том, что строки пропускаются и остаются нулевыми в моем цикле foreach – Reeggiie

+0

Поэтому всякий раз, когда я обновляю свою базу данных, применяются нули, где в этом случае должно быть 0. – Reeggiie

+0

Можете ли вы запустить профилировщик sql и посмотреть, правильно ли обновлены строки? –

Смежные вопросы