为什么两个相同的DataTable不会显示任何差异?

时间:2012-03-29 08:51:03

标签: c# datatable

我正在使用DataRelation来比较两个DataTable并使用此tutorial返回包含两个原始表不共享的行的第三个表。以下是代码。

public static DataTable Difference(DataTable First, DataTable Second)
{
      //Create Empty Table

      DataTable table = new DataTable("Difference");

      //Must use a Dataset to make use of a DataRelation object

      using(DataSet ds = new DataSet())   
      {
            //Add tables
            ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.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 r = new DataRelation(string.Empty,firstcolumns,secondcolumns,false);

            ds.Relations.Add(r);

            //Create columns for return table   
            for(int i = 0; i < First.Columns.Count; i++)    
            {    
                  table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);    
            }

            //If First Row not in Second, Add to return table.    
            table.BeginLoadData();

            foreach(DataRow parentrow in ds.Tables[0].Rows)    
            {    
                  DataRow[] childrows = parentrow.GetChildRows(r);

                  if(childrows == null || childrows.Length == 0)    
                        table.LoadDataRow(parentrow.ItemArray,true);        
            }

            table.EndLoadData();    
      }

      return table;    
}

当我练习这段代码时,令人惊讶的是,它仅适用于少数情况,而其他情况则失败。

有一个案例,我正在比较两个相同的表(但有不同的来源),两者都有:

  • 同一列名称&amp; DataType
  • 相同数量的行&amp;列
  • 每个单元格中的相同值

只返回一个品牌新表,其实际上具有与两个原始表完全相同的组合

可能错过什么

两个相同的表格(我上面提到的共享功能)是否有可能具有其他不同的属性(用户眼睛看不出来)?< / p>

或者这可能是一个不好的方法?有哪些可能的选择?

EDITED

  1. 两个表都具有相同的原始数据类型,例如:System.StringSystem.Int32System.DateTime
  2. 这些代码不适用于我测试的所有样本
  3. 这是一个样本的打印屏幕(使用DataSet Visualizer)
  4. enter image description here

1 个答案:

答案 0 :(得分:1)

我必须写一次类似的东西,这是我使用的方法:

首先,只有在每个表中没有重复的行时,此方法才有效。

使用主键..

First.PrimaryKey = firstcolumns;
Second.PrimaryKey = secondcolumns; //These throw exceptions when you have duplicate rows

然后..

foreach (DataRow dr in Second.Rows)
{
    List<Object> l = new List<Object>();

    foreach (DataColumn dc in secondcolumns) l.Add(dr[dc]);

    if (First.Rows.Find(l.ToArray()) == null) //NOT FOUND
    {
        table.Rows.Add(l.ToArray());
    }
}

foreach (DataRow dr in First.Rows)
{
    List<Object> l = new List<Object>();

    foreach (DataColumn dc in firstcolumns) l.Add(dr[dc]);

    if (Second.Rows.Find(l.ToArray()) == null) //NOT FOUND
    {
        table.Rows.Add(l.ToArray());
    }
}

干杯,