Во-первых, мне нужно получить все данные из ODBC (это уже работает).
Затем следует самая сложная часть, которую я пока не знаю, как это можно сделать. В ODBC есть две таблицы данных. Я объединяю их с моим текущим кодом и фильтрую по определенным параметрам.
Таблица 1 в базе данных:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Таблица 2 в базе данных:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
Объединенная таблица данных выглядит следующим образом:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Однако объединенный выходной dataTable должен выглядеть так (чтобы иметь возможность работать с ним дальше):
NRO NRO1 NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 463 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Найти дубликаты в NAME
. Оставьте только один из них, присвойте номер из таблицы 1, NRO
из таблицы 2 - NRO1
. Номера таблиц 1 должны быть в NRO
, номера таблиц 2 должны быть в NRO1
.
После подключения к ODBC я заполняю одну таблицу данными из таблицы 1
DataTable dataTable = new DataTable("COMPANY");
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
затем я получаю данные из другой таблицы 2 и объединяю их:
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
}
После этого я выполняю фильтрацию (мне нужно, чтобы строки были только с 4 и 1 NRO
, есть строки с другим начальным номером):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Затем я добавляю еще один столбец для NRO1
(это также добавляет нули (0), они мне не нужны в столбце NRO1
):
results.Columns.Add("NRO1", typeof(int)).SetOrdinal(1);
foreach (DataRow row in results.Rows)
{
//need to set value to NewColumn column
row["NRO1"] = 0; // or set it to some other value
}
Я могу поймать дубликаты с этим кодом
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
а как сделать остальное? Это должно быть выполнено циклом с созданием новой таблицы? Как я могу выполнить объединение и удаление дубликатов dataTable
?
dataTable
содержать более двух дубликатов для одного имени? Например, возможно ли существование трех дубликатов для BMW? 2. Как мы можем определить, какие из дублирующих записей следует сохранить, а какие удалить? Например, мы можем вести запись с минимумомNRO
и удалить другую запись.NAME
. Если больше двух - ошибка (обработчик ошибок). 2. В моем примере произошла ошибка, сейчас я ее исправил. Спасибо за упоминание этого, это важно.Ответы:
Вы можете заменить
merge()
вызов пользовательским методом, который выполняет слияние и фильтрацию одновременно. Смотрите пример ниже. Я думаю, что это лучший подход, чем первое слияние (введение повторяющихся строк в таблицу результатов), а затем фильтрация (то есть удаление повторяющихся строк).Здесь предполагается, что все параметры имеют одинаковый формат.
tTemp
Таблица используются в качестве временного хранилища для содержимого таблицы ,t2
но с дополнительной колонкой. Это позволяет импортировать строки в таблицу результатов.Может быть, есть более элегантное решение, но это должно работать как задумано. Обратите внимание, что я исключил ваше дополнительное требование относительно допустимых значений
NRO
, которое, я уверен, вы можете легко добавить.источник
'DataTable' does not contain a definition for 'Merge_it' and no accessible extension method 'Merge_it' accepting a first argument of type 'DataTable' could be found (are you missing a using directive or an assembly reference?)
после заменыdataTable.Merge(newTable);
наdataTable.Merge_it(newTable);
class Merger {...}
мой код и звонитеMerger.merge_it(...)
. Вы должны подготовить входные параметры, хотя.using
директивы, конечно. Это просто фрагмент (из рабочей программы).Попробуй это:
Установить значение по умолчанию 0 для NRO1 для Table1 (изменить queryStringSE)
Например: SELECT NRO, 0 AS NRO1, NAME, NAMEA, NAMEB, ... FROM TABLE1
Установить значение по умолчанию 0 для NRO для таблицы 2 (изменить queryStringFI)
Например: ВЫБЕРИТЕ 0 КАК NRO, NRO AS NRO1, ИМЯ, NAMEA, NAMEB, ...... ИЗ ТАБЛИЦЫ2
Table1 будет выглядеть так:
Таблица2 будет выглядеть так:
Добавьте следующие строки кода:
источник
Вы можете сохранить одинаковое имя столбца в обеих таблицах, если они обозначают один и тот же тип объекта, тогда посмотрите этот код
источник