2009-11-09 2 views
2

Я пытаюсь получить все строки, которые существуют в allData, но не в removeDataDataTable.GetChanges() продолжает возвращаться NULL

public static DataTable RemoveDuplicateRows(DataTable allData, 
    DataTable removeData) 
{ 
    removeData.Merge(allData); 
    DataTable newData = removeData.GetChanges(); 
    removeData.RejectChanges(); 
    return newData; 
} 

removeData пуст до вызова в этом случае (только новый DataTable ())

Но newData всегда имеет значение нуля после DataTable newData = removeData.GetChanges(); линии

Окончательного решения:

public static DataTable RemoveDuplicateRows(DataTable allData, DataTable removeData) 
    { 
     DataTable duplicate = allData.Clone(); 
     foreach (DataRow row in allData.Rows) 
     { 
      duplicate.ImportRow(row); 
     } 
     foreach (DataRow row in duplicate.Rows) 
     { 
      row.SetAdded(); 
     } 

     removeData.Merge(duplicate); 
     DataTable newData = removeData.GetChanges(DataRowState.Added); 
     removeData.RejectChanges(); 
     allData.RejectChanges(); 
     return newData; 
    } 

ответ

0

removeData У DataTable должны быть одинаковые столбцы/поля, такие как allData. Другими словами, это не просто новый DataTable().

+0

Итак, теперь я пишу старые данные и схему в файловую систему (WriteXml и WriteXmlSchema), затем загружаю их в removeData (с ReadXmlSchema и ReadXml). И allData содержит данные из db (у которого есть еще 2 записи, чем в файловой системе xml). Поэтому, когда я добираюсь до этого кода, я вижу, что allData имеет 21 строку и removeData имеет 19. Затем слияние приводит к тому, что removeData имеет 40! И тогда GetChanges все еще возвращает null – CaffGeek

+0

Исправлены первичные ключи, так что когда я объединил их, у них есть 21 строка, но GetChanges по-прежнему возвращает NULL! – CaffGeek

+0

Придется работать с некоторым mojo, чтобы добавить добавленные строки, которые будут помечены как добавленные, я обновил исходный вопрос с окончательным решением – CaffGeek

1

Метод DataTable.GetChanges() зависит от свойства DataRow.RowState. Для каждой строки в паре DataTables значение DataTable.Merge() либо сохранит их свойство «RowState», либо сбросит его на «Без изменений» (в зависимости от используемой вами перегрузки). Это означает, что при объединении двух таблиц данных с строками, имеющими «неизмененные» строки RowStates, объединенная таблица также будет содержать строки «Без изменений», а метод DataTable.GetChanges возвращает null или Nothing.