Почему две одинаковые таблицы данных не показывают каких-либо различий? - PullRequest
2 голосов
/ 29 марта 2012

Я использую DataRelation для сравнения двух DataTable и возврата третьей таблицы, содержащей строки, которые не являются общими для обеих исходных таблиц, с помощью этого учебника .Ниже приведен код.

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

Удивительно, но когда я применил этот код, он работал только в нескольких случаях, а в других - неудачно.

Был один случай, я сравнивал две идентичные таблицы(но имеет другой источник), которые оба имеют:

  • Одинаковое имя столбца & DataType
  • Одинаковое количество строк и столбцов
  • Одинаковое значение в каждой ячейке

Только для того, чтобы был возвращен новый стол , который фактически имеет тот же состав , что и две оригинальные таблицы!

Что я пропустил , возможно ?

Возможно ли, что две идентичных таблицы (общие функции, о которых я упоминал выше) могут иметь другие различные свойства (которые не видны пользователям "глаза)?

Или, возможно, это действительно плохой метод ?Каковы возможные альтернативы?

EDITED

  1. Обе таблицы имеют одинаковый примитивный тип данных, такой как: System.String, System.Int32, System.DateTime
  2. Этот код работает не на всех протестированных мною образцах
  3. Вот экран печати 1 образца (с использованием DataSet Визуализатор)

enter image description here

1 Ответ

1 голос
/ 24 апреля 2012

Однажды мне пришлось написать нечто подобное, и я использовал этот подход:

Сначала этот подход работает, только если в каждой таблице нет повторяющихся строк.

Использование первичных ключей ..

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

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...