比较数据表

本文关键字:数据表 比较 | 更新日期: 2023-09-27 17:47:23

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

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。行[i][dc.列名] 否则为语句 t1。Rows[i][dc.ColumnName] != t2.Rows[i][dc.ColumnName] 始终为真。 我按以下方式修改了代码:

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;
   }

在这里,此函数将给出布尔值作为结果,如果两者都相同,则返回 true,如果两者都不同,则返回 false