C#/ ADO.NET - 在数据表中使用SetField时会跳过行?

时间:2016-01-11 15:46:27

标签: c# sql-server datatable ado.net

我有一个每天运行的控制台应用程序来更新我的数据库。

每天,应用程序会将所有Ticket数据拉入数据表。

在这种特殊情况下,我正在尝试计算数据库中尚未响应的每个故障单是否已超过为该故障单分配的最大响应时间(以小时为单位)。机票报告日期与今天的日期。

如果响应时间已经过了,则在Response_met列中设置值0(false),否则为1(true)。

当新票证添加到数据库时,它们的Response_Met最初为NULL,直到运行此更新并计算响应时间是否已经过去。

这是udpate之前的数据表。

enter image description here

突出显示的单元格当前为NULL。更新后,它应该更改为0(false),因为Max_response_time是1.00 HOUR,并且该票据在2014年报告,并且没有response_time。

这是更新后的数据表,它没有改变。

enter image description here

他们是在数据表中发生这种情况的几个实例,我只是在这里展示第一个实例。

有人能告诉问题在哪里吗?为什么在更新后会跳过某些行并保留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();
            }

1 个答案:

答案 0 :(得分:0)

您应该调用da2.Update(dtResponse)来实际更新数据库,否则您只是更改数据行rowstate