比较数据表

我构建了一个应用程序,它在窗口中显示数据库中的记录,并每隔几秒检查数据库中的新记录。 问题是每次检查新记录时窗口都会闪烁,我想修复它。 我试图将旧数据表与新数据表进行比较,只有在它们不同时才进行刷新。 有谁知道这种情况的最佳做法是什么? 我尝试按以下方式执行此操作,但它不起作用:

private bool GetBelongingMessages() { bool result = false; DataTable dtTemp = OleDbWorks.GetBelongingMessages(currentCallID); if(dtTemp != dtMessages) { dtMessages = dtTemp; result = true; } else { result = false; } return result; } 

首先,重要的是要认识到您在代码中比较的是数据表的引用 ,而不是数据表的内容 。 为了确定两个数据表是否具有相同的内容,您将不得不遍历所有的行和列,看看它们是否相等:

 //This assumes the datatables have the same schema... public bool DatatablesAreSame(DataTable t1, DataTable t2) { if (t1.Rows.Count != t2.Rows.Count) return false; foreach (DataColumn dc in t1.Columns) { for (int i = 0; i < t1.Rows.Count; i++) { if (t1.Rows[i][dc.ColumnName] != t2.Rows[i][dc.ColumnName]) { return false; } } } return true; } 

我一直试图找到一种方法来进行DataTable比较一段时间并最终编写我自己的函数,这是我得到的:

 bool tablesAreIdentical = true; // loop through first table foreach (DataRow row in firstTable.Rows) { foundIdenticalRow = false; // loop through tempTable to find an identical row foreach (DataRow tempRow in tempTable.Rows) { allFieldsAreIdentical = true; // compare fields, if any fields are different move on to next row in tempTable for (int i = 0; i < row.ItemArray.Length && allFieldsAreIdentical; i++) { if (!row[i].Equals(tempRow[i])) { allFieldsAreIdentical = false; } } // if an identical row is found, remove this row from tempTable // (in case of duplicated row exist in firstTable, so tempTable needs // to have the same number of duplicated rows to be considered equivalent) // and move on to next row in firstTable if (allFieldsAreIdentical) { tempTable.Rows.Remove(tempRow); foundIdenticalRow = true; break; } } // if no identical row is found for current row in firstTable, // the two tables are different if (!foundIdenticalRow) { tablesAreIdentical = false; break; } } return tablesAreIdentical; 

与Dave Markle的解决方案相比,我的处理两个表具有相同的记录,但顺序不同。 希望这能帮助那些偶然发现这个主题的人。

你必须转换对象t1.Rows [i] [dc.ColumnName]和t1.Rows [i] [dc.ColumnName]否则语句t1.Rows [i] [dc.ColumnName]!= t2.Rows [i] [dc.ColumnName]始终为true。 我通过以下方式修改了代码:

 for(int i = 0; i < t1.Rows.Count; i++) { if((string)t1.Rows[i][1] != (string)t2.Rows[i][1]) return false; } 

它有效,但它不是一个优雅的解决方案。

  public Boolean CompareDataTables(DataTable table1, DataTable table2) { bool flag = true; DataRow[] row3 = table2.Select(); int i = 0;// row3.Length; if (table1.Rows.Count == table2.Rows.Count) { foreach (DataRow row1 in table1.Rows) { if (!row1.ItemArray.SequenceEqual(row3[i].ItemArray)) { flag = false; break; } i++; } } else { flag = false; } return flag; } 

//这里这个函数会给boolean作为结果如果两者都相同则返回true如果两者不相同则返回false