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

Posted

技术标签:

【中文标题】C#/ADO.NET - 在数据表中使用 SetField 时跳过的行?【英文标题】:C#/ADO.NET - Rows being skipped while using SetField in datatable? 【发布时间】:2016-04-16 00:01:16 【问题描述】:

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

应用程序每天都会将所有 Ticket 数据提取到数据表中。

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

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

当新工单被添加到数据库时,它们的 Response_Met 最初为 NULL,直到运行此更新并计算 response_time 是否已过。

这是更新前的数据表。

突出显示的单元格当前为 NULL。更新后应该会变成0(false),因为Max_response_time是1.00 HOUR,而且ticket是2014年上报的,没有response_time。

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

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

谁能说出问题出在哪里?为什么更新后某些行被跳过并保留为 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】:

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

【讨论】:

更新数据库确实是问题所在,我在代码的其他地方这样做。问题是我的 foreach 循环中的行被跳过并留空 所以每当我更新我的数据库时,都会应用空值,在这种情况下,应该是 0。 你能启动 sql profiler 看看行是否真的正确更新了吗? 我没有使用它的经验,我从来没有听说过。简单吗? 是的,这很简单。看看这个tutorial。它使用的是旧版本(Sql Server 2005),但现在几乎一样

以上是关于C#/ADO.NET - 在数据表中使用 SetField 时跳过的行?的主要内容,如果未能解决你的问题,请参考以下文章

ADO.Net DataTables 有索引吗?

使用 PostgreSql 和 ADO.NET 在 C# WinForms 中锁定记录和表

ADO.Net 同步和 SQL CE

C#ADO .Net Entities Framework使用查询语句时遇到的错误

ADO.NET 执行部分更新/插入

使用 ADO.NET 流畅的 NHibernate 地图