powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DataTable.Merge() с первичным ключом
5 сообщений из 5, страница 1 из 1
DataTable.Merge() с первичным ключом
    #36769018
ASaveljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Есть исходная таблица (DataTable):
IDVal...10...20...
В ней колонка ID указана как Primary Key.
Затем программно генерируется вторая DataTable:
IDVal1100240350
Задача - обновить колонку Val в первой таблице значениями из второй.

Вот максимально упрощенный код генерации второй таблицы и слияния:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID", typeof(System.Int32));
            dt2.Columns.Add("Val", typeof(System.Double));
            dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] };
            dt2.Rows.Add(1, 100);
            dt2.Rows.Add(2, 40);
            dt2.Rows.Add(3, 50);
            dt1.Merge(dt2, false, MissingSchemaAction.Ignore);
Но у этого кода есть недостаток, он пытается осуществить слияние всех строк, а для третьей строки в dt2 нет соответствующего ключа в dt1, поэтому я получаю эксепшн. В моем случае надо, чтобы треться строка отбрасывалась.

Я понимаю, что можно решить проблему если добавить в код генерации dt2 проверку существования ключа каждой строки в dt1, но мне кажется, что это некрасиво.

Есть ли другое, элегантное решение?
...
Рейтинг: 0 / 0
DataTable.Merge() с первичным ключом
    #36770510
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял, какой экспепшен?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof(System.Int32));
dt1.Columns.Add("Val", typeof(System.Double));
dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0] };
dt1.Rows.Add(1, 0);
dt1.Rows.Add(2, 0);

DataTable dt2 = new DataTable();
dt2.Columns.Add("ID", typeof(System.Int32));
dt2.Columns.Add("Val", typeof(System.Double));
dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] };
dt2.Rows.Add(1, 100);
dt2.Rows.Add(2, 40);
dt2.Rows.Add(3, 50);

dt1.Merge(dt2, false, MissingSchemaAction.Ignore);
...
Рейтинг: 0 / 0
DataTable.Merge() с первичным ключом
    #36770976
ASaveljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, эксепшн возникал по другой причине, которую я уже устранил (ключевая колонка неправильно называлась).

Но проблема все равно осталась, в таблице dt1 примерно 20 колонок, и после операции Merge в ней появляется еще одна запись (Id=3) с заполненными ID и Val а всё остальное - пусто. Моя задача - объединять таблицы так, чтобы лишние строки отбрасывались, то есть в итоге получилась такая таблица:

IDVal...1100...240...

На данный момент я реализовал заполнение таблицы dt2 следующим образом (код сильно упрощён):

Код: plaintext
1.
2.
3.
4.
5.
6.
            int[] value = new int[] { 100, 40, 50 };
            for (int i = 1; i <= 3; i++)
            {
                if (dt1.Select("ID = " + i.ToString()).Length != 0)
                    dt2.Rows.Add(i, value[i]);
            }

Если иначе нельзя никак, тогда закроем тему...
...
Рейтинг: 0 / 0
DataTable.Merge() с первичным ключом
    #36771037
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это уже не мерж, а подобие джойна :)

Предлагаю выкрутиться так, чтобы не делать лишних циклов.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DataTable dt1 = new DataTable();
dt1.Columns.Add("ID", typeof(System.Int32));
dt1.Columns.Add("Val", typeof(System.Double));
dt1.Columns.Add("IsDefaultRecord", typeof(System.Boolean));
dt1.PrimaryKey = new DataColumn[] { dt1.Columns[0] };
dt1.Rows.Add(1, 0, true);
dt1.Rows.Add(2, 0, true);

DataTable dt2 = new DataTable();
dt2.Columns.Add("ID", typeof(System.Int32));
dt2.Columns.Add("Val", typeof(System.Double));
dt2.PrimaryKey = new DataColumn[] { dt2.Columns[0] };
dt2.Rows.Add(1, 100);
dt2.Rows.Add(2, 40);
dt2.Rows.Add(3, 50);

dt1.Merge(dt2);

var rows = dt1.Select("IsDefaultRecord=True");
...
Рейтинг: 0 / 0
DataTable.Merge() с первичным ключом
    #36771075
ASaveljev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Замечательный выход, возьму на заметку.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DataTable.Merge() с первичным ключом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]