2013-09-20 4 views
0

Ну, скажем, у меня есть 2 Datatables с самого начала.C# Compare 2 DataTables заполняет изменения в третьем DataTable

Первый (источник) содержит данные из базы данных da. Второй также содержит данные из базы данных, гайка эти значения должны быть обновлены в первой базе данных.

К сожалению, они не имеют такой же структуры. У источника sourcedatatable есть несколько дополнительных столбцов, которые у второго нет.

Например:

First DT: ID | Name | Company | Age 
Second DT: Name | Company | Age 

Я хочу FIRST DataTable быть обновлен со значениями из второго DataTable Если есть некоторые различия (и только различие).

Любые идеи о том, как это сделать? Любые предложения о производительности, даже если вы используете очень большие базы данных?

+1

Как вы можете сопоставить запись между таблицами или клавишами таблицы? –

+1

Как вы хотите определить правильную строку во второй таблице, потому что нет идентификатора. Определяет ли это имя? Также ваш заголовок подсказывает, что вы хотите обновить/вставить третью таблицу, но в вопросе вы упомянули, что вы хотите, чтобы FIRST DataTable обновлялся со значениями из второго DataTable. Что правильно? –

+0

jepp, я хочу определить его через имя столбца значение. если это то же самое, что и в источнике, то нужно просто обновить остальные (например, autoindex). @Tim Я хочу, чтобы обновленные значения от DT 1 (от значений DT 2) в DT 3 – Thyrador

ответ

0

Если вы работаете с большим количеством данных, я бы предложил сделать вещи как можно ближе к БД (если возможно, в хранимой процедуре).

Если придерживаться .NET является обязательным, это параметры, которые я бы рассмотрел с учетом описания вашего сценария, который вы предоставили.

Во-первых, я бы выбрал, как загрузить данные (порядок, в котором я хотел бы рассмотреть их):

  1. Генерирование сущностей (LINQ к SQL).
  2. Использование F-провайдеров # Тип
  3. Использование ADO непосредственно

После этого, я бы либо:

  1. использование .Select и .Except на IQueryable источников или
  2. сделать что-то подобное до http://canlu.blogspot.ro/2009/05/how-to-compare-two-datatables-in-adonet.html, если я случайно использовал ADO.NET

Трудно дать конкретный и точный ответ, если вы не предоставите больше информации о типе данных, количестве, оборудовании, типе базы данных.

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

+0

тип db - это совершенно самостоятельная вещь. это внешняя база данных, но совершенно отличная от SQL, и т. д. – Thyrador

+0

Хорошо, тогда мой ответ не имеет значения. секундочку. :) – asd007

+0

Вот почему мне нужно работать с использованием данных;) – Thyrador

0

Этот код предназначен только для справки, у меня не было времени его протестировать. Это может немного подкорректировать. Попробуйте что-нибудь вроде:

var a = new DataTable(); 
a.Columns.Add("ID"); 
a.Columns.Add("Name"); 
a.Columns.Add("Company"); 
a.Columns.Add("Age"); 

var b = new DataTable(); 
b.Columns.Add("Name"); 
b.Columns.Add("Company"); 
b.Columns.Add("Age"); 

var destination = a.AsEnumerable(); 
var localValues = b.AsEnumerable(); 


var diff = destination.Join(localValues, dstRow => dstRow["Name"], srcRow => srcRow["Name"], 
    (dstRow, srcRow) => 
new {Destination = dstRow, Source = srcRow}) 
.Where(combinedView => 
    combinedView.Destination["Age"] != combinedView.Source["Age"] || 
    combinedView.Destination["Company"] != combinedView.Source["Company"]); 

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

+0

Я только что понял что-то. Это не решит вашу проблему с добавлением недостающих строк, это будет работать только для существующих строк :). Возможно, вы можете изменить условие соединения, чтобы вести себя как правое соединение SQL. – asd007

+0

Я попробую позже. К сожалению, я не могу изменить тип базы данных. На ней основана целая структура. – Thyrador

+0

Вы можете проверить http://stackoverflow.com/questions/4497086/linq-left-join-and-right-join – asd007

Смежные вопросы