如何比较两个数据表的更改后的值?

问题描述 投票:0回答:1

此问题在堆栈上已问过几次,但在标记为重复之前,请先查看我的问题。

我正在尝试比较两个数据表的更改值。基本上,尝试通过比较来记录更新的数据。

这是我的数据表,需要进行比较以进行更改:

“我的数据表”

在表2中,Id 3和4具有更新的值,我需要获取这些值并将其存储在3rd DataTable中。如果我为此得到一些通用类,那就更好了。

此外,如果有人添加更多内容,并告诉我在两个相同类型的列表的情况下如何比较更改并仅返回具有更改值的该类型的列表?

在这里,我要求更多,但是否有人可以帮助我。

c# .net linq datatable
1个回答
0
投票

您可以尝试此方法并适应您的预期用途:

static private DataMismatch GetDifferentRecords(DataTable dataTable1, 
                                                DataTable dataTable2, 
                                                string keyID)
{
  if ( dataTable1.Columns.Count != dataTable2.Columns.Count )
    throw new Exception("Tables have not the same columns count.");

  for ( int indexColumn = 0; indexColumn < dataTable1.Columns.Count; indexColumn++ )
  {
    string columnName1 = dataTable1.Columns[indexColumn].ColumnName;
    string columnName2 = dataTable2.Columns[indexColumn].ColumnName;
    if ( columnName1 != columnName2 )
      throw new Exception($"Tables columns name mismatch : {columnName1} <=> {columnName2}");
    var columnType1 = dataTable1.Columns[indexColumn].DataType;
    var columnType2 = dataTable2.Columns[indexColumn].DataType;
    if ( columnType1 != columnType2 )
      throw new Exception($"Tables columns type mismatch : {columnType1.Name} <=> {columnType2.Name}");
  }

  var result = new DataMismatch();

  for ( int indexRow = 0; indexRow < dataTable1.Rows.Count; indexRow++ )
  {
    object columnKeyValue = null;
    for ( int indexColumn = 0; indexColumn < dataTable1.Columns.Count; indexColumn++ )
      if ( dataTable1.Columns[indexColumn].ColumnName == keyID )
        columnKeyValue = dataTable1.Rows[indexRow][indexColumn].ToString();
    if ( columnKeyValue == null)
      throw new Exception($"Key not found : {keyID}");
    for ( int indexColumn = 0; indexColumn < dataTable1.Columns.Count; indexColumn++ )
    {
      string columnName1 = dataTable1.Columns[indexColumn].ColumnName;
      string columnName2 = dataTable2.Columns[indexColumn].ColumnName;
      var value1 = dataTable1.Rows[indexRow][indexColumn];
      var value2 = dataTable2.Rows[indexRow][indexColumn];
      if ( !value1.Equals(value2) )
      {
        var items = new Tuple<object, object>(value1, value2);
        var mismatch = new Dictionary<string, Tuple<object, object>>();
        mismatch.Add(columnName1, items);
        if ( result.ContainsKey(columnKeyValue) )
          result[columnKeyValue].Add(columnName1, items);
        else
          result.Add(columnKeyValue, mismatch);
      }
    }
  }

  return result;
}

测试:

try
{
  var diff = GetDifferentRecords(before, after, "Id");

  foreach ( var item in diff )
  {
    Console.WriteLine($"Id({item.Key}) mismatch:");
    foreach ( var value in item.Value )
    {
      Console.Write($"  Column({value.Key}): ");
      Console.WriteLine($"{ value.Value.Item1.ToString()} <=> { value.Value.Item2.ToString()} ");
    }
    Console.WriteLine();
  }
}
catch ( Exception ex )
{
  Console.WriteLine(ex.Message);
}
© www.soinside.com 2019 - 2024. All rights reserved.