如何比较2个dataTables

我有2个数据表,我只想知道它们是否相同。 “相同”,我的意思是它们具有完全相同的行数,每列中的数据完全相同或不相同。 我喜欢编写(查找)接受两个表并返回布尔值的方法。

如何以这种方式比较2个数据表? 两者都有相同的模式。

您需要循环遍历每个表的行,然后遍历该循环中的每个列以比较各个值。

这里有一个代码示例: http : //canlu.blogspot.com/2009/05/how-to-compare-two-datatables-in-adonet.html

public static bool AreTablesTheSame( DataTable tbl1, DataTable tbl2) { if (tbl1.Rows.Count != tbl2.Rows.Count || tbl1.Columns.Count != tbl2.Columns.Count) return false; for ( int i = 0; i < tbl1.Rows.Count; i++) { for ( int c = 0; c < tbl1.Columns.Count; c++) { if (!Equals(tbl1.Rows[i][c] ,tbl2.Rows[i][c])) return false; } } return true; } 

如果您将DataTable作为函数返回,您可以:

 DataTable dataTable1; // Load with data DataTable dataTable2; // Load with data (same schema) var differences = dataTable1.AsEnumerable().Except(dataTable2.AsEnumerable(), DataRowComparer.Default); return differences.Any() ? differences.CopyToDataTable() : new DataTable(); 

OP, MAW74656最初在问题机构中回答了这个答案,以回应已接受的答案 ,如本评论所述 :

我使用它并编写了一个公共方法来调用代码并返回布尔值。

OP的答案是:

使用代码:

 public bool tablesAreTheSame(DataTable table1, DataTable table2) { DataTable dt; dt = getDifferentRecords(table1, table2); if (dt.Rows.Count == 0) return true; else return false; } //Found at http://canlu.blogspot.com/2009/05/how-to-compare-two-datatables-in-adonet.html private DataTable getDifferentRecords(DataTable FirstDataTable, DataTable SecondDataTable) { //Create Empty Table DataTable ResultDataTable = new DataTable("ResultDataTable"); //use a Dataset to make use of a DataRelation object using (DataSet ds = new DataSet()) { //Add tables ds.Tables.AddRange(new DataTable[] { FirstDataTable.Copy(), SecondDataTable.Copy() }); //Get Columns for DataRelation DataColumn[] firstColumns = new DataColumn[ds.Tables[0].Columns.Count]; for (int i = 0; i < firstColumns.Length; i++) { firstColumns[i] = ds.Tables[0].Columns[i]; } DataColumn[] secondColumns = new DataColumn[ds.Tables[1].Columns.Count]; for (int i = 0; i < secondColumns.Length; i++) { secondColumns[i] = ds.Tables[1].Columns[i]; } //Create DataRelation DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false); ds.Relations.Add(r1); DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false); ds.Relations.Add(r2); //Create columns for return table for (int i = 0; i < FirstDataTable.Columns.Count; i++) { ResultDataTable.Columns.Add(FirstDataTable.Columns[i].ColumnName, FirstDataTable.Columns[i].DataType); } //If FirstDataTable Row not in SecondDataTable, Add to ResultDataTable. ResultDataTable.BeginLoadData(); foreach (DataRow parentrow in ds.Tables[0].Rows) { DataRow[] childrows = parentrow.GetChildRows(r1); if (childrows == null || childrows.Length == 0) ResultDataTable.LoadDataRow(parentrow.ItemArray, true); } //If SecondDataTable Row not in FirstDataTable, Add to ResultDataTable. foreach (DataRow parentrow in ds.Tables[1].Rows) { DataRow[] childrows = parentrow.GetChildRows(r2); if (childrows == null || childrows.Length == 0) ResultDataTable.LoadDataRow(parentrow.ItemArray, true); } ResultDataTable.EndLoadData(); } return ResultDataTable; } 

尝试使用linq到Dataset

 (from b in table1.AsEnumerable() select new { id = b.Field("id")}).Except( from a in table2.AsEnumerable() select new {id = a.Field("id")}) 

查看本文: 使用LINQ比较DataSet

我得到了如何比较2个dataTables的解决方案

http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html

如果您在数据库中有表,则可以进行完全外连接以获得差异。 例:

 select t1.Field1, t1.Field2, t2.Field1, t2.Field2 from Table1 t1 full outer join Table2 t2 on t1.Field1 = t2.Field1 and t1.Field2 = t2.Field2 where t1.Field1 is null or t2.Field2 is null 

过滤掉所有相同的记录。 根据记录来自哪个表,在前两个或最后两个字段中都有数据。

  ///  /// https://stackoverflow.com/a/45620698/2390270 /// Compare a source and target datatables and return the row that are the same, different, added, and removed ///  /// DataTable to compare /// DataTable to compare to dtOld /// DataTable that would give you the common rows in both /// DataTable that would give you the difference /// DataTable that would give you the rows added going from dtOld to dtNew /// DataTable that would give you the rows removed going from dtOld to dtNew public static void GetTableDiff(DataTable dtOld, DataTable dtNew, ref DataTable dtSame, ref DataTable dtDifferences, ref DataTable dtAdded, ref DataTable dtRemoved) { try { dtAdded = dtOld.Clone(); dtAdded.Clear(); dtRemoved = dtOld.Clone(); dtRemoved.Clear(); dtSame = dtOld.Clone(); dtSame.Clear(); if (dtNew.Rows.Count > 0) dtDifferences.Merge(dtNew.AsEnumerable().Except(dtOld.AsEnumerable(), DataRowComparer.Default).CopyToDataTable()); if (dtOld.Rows.Count > 0) dtDifferences.Merge(dtOld.AsEnumerable().Except(dtNew.AsEnumerable(), DataRowComparer.Default).CopyToDataTable()); if (dtOld.Rows.Count > 0 && dtNew.Rows.Count > 0) dtSame = dtOld.AsEnumerable().Intersect(dtNew.AsEnumerable(), DataRowComparer.Default).CopyToDataTable(); foreach (DataRow row in dtDifferences.Rows) { if (dtOld.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray)) && !dtNew.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray))) { dtRemoved.Rows.Add(row.ItemArray); } else if (dtNew.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray)) && !dtOld.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray))) { dtAdded.Rows.Add(row.ItemArray); } } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } } 

没有什么可以为你做这件事; 您要完成此任务的唯一方法是迭代所有行/列并将它们相互比较。

好吧,如果您正在使用DataTable,那么您可以将比较两个’DataTable’的DataTable比较加载的原始数据时将要更改的DataTable AKA DataTable.GetChanges Method(DataRowState)

或者,我没有实现数组比较,所以你也会有一些乐趣:)

 public bool CompareTables(DataTable a, DataTable b) { if(a.Rows.Count != b.Rows.Count) { // different size means different tables return false; } for(int rowIndex=0; rowIndex