С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230

Как получить DataTable из двух связанных таблиц?

27.11.2016, 18:38. Показов 3138. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть DataSet, включающий две связанные таблицы. Мне нужно получить на выходе DataTable - выборку из этих двух таблиц. Перерыл интернет, ответа найти самостоятельно не удалось. Я так понял, что можно использовать DataAdapter и писать там прямой запрос типа: "Select A.a, B.b from A left join B on A.id=B.user_id", но не вышло
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.11.2016, 18:38
Ответы с готовыми решениями:

Как редактировать данные из двух связанных таблиц?
компонент fdquery. имеются данные таблицы l2,l3. в l2 столбцы cтрана,город,ид. в l3 столбец формап,ид1. помогите отредактировать...

Как удалить записи из двух не связанных таблиц
Как удалить записи из двух не связанных таблиц одним запросом? База данных Аксесс 2007, язык C#. Пробовал так: DeleteCommandText =...

Как вывести информацию из двух связанных по ID таблиц
Но если во второй таблице три поля, в котором присутствую ID из первой таблице!!!! Я сколько не бился, не получается! Максимум что...

5
 Аватар для Козадоев
163 / 153 / 33
Регистрация: 05.03.2013
Сообщений: 876
28.11.2016, 06:54
Мало просто в DataAdapter прописать select нужно в коде в нужном месте вызвать эту загрузку типа DataAdapter.FillBy
если это есть, то возможно здесь ошибка
не left join B on A.id=B.user_id а left join B on B.user_id =A.id
0
 Аватар для Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
28.11.2016, 16:07  [ТС]
Козадоев, с left join'ом строка написана тут чисто ради примера. А вот с DataAdapter мне бы подробнее на пальцах, у меня не вышло с ним связать две таблицы, пришлось городить какой-то полуработающий код с linq
0
 Аватар для Козадоев
163 / 153 / 33
Регистрация: 05.03.2013
Сообщений: 876
29.11.2016, 07:48
Добавлено через 18 минут
Цитата Сообщение от Antykus Посмотреть сообщение
у меня не вышло с ним связать две таблицы
Если Вам нужно получить в одной таблице значения из 2х - то Вы сами ответили на свой вопрос. Можно использовать представленный вами Select. У Вас есть основной запрос, его лучше не переопределять, т.к. слетят команды обновления этой таблицы. Добавьте еще запрос в дизайнере датасета. При сохранении он может сказать, что схема отличается от основной т.к. могут появиться дополнительные столбцы, не относящиеся к этой таблице. В основном запросе просто добавьте столбцы в запрос с пустыми значениями - все будет работать. Такой вариант годится, когда к основной таблице нужно подгрузить данные из другой, при этом возможность изменять и сохранять таблицу останется без учета подгруженных данных.

Есть другой вариант - создать отдельный TableAdapter - прописать запрос на 2 таблицы. При этом можно будет только загружать данные в эту таблицу - добавлять, изменять с сохранением по умолчанию он не будет - такой адаптер удобен для отчетных данных когда нужно просто вывести некоторый набор. Но можно и доопределить команды обновления по нужной вам схеме.

Есть еще вариант - загрузить данные в обе таблицы основными запросами. И в DataGridView для ссылочных колонок указать тип - ComboBox, выбрать в свойствах колонки указатели на данные из второй таблицы. Тогда данные будут отображаться не виде ID, а в виде наименования и их можно будет выбирать (изменять) в колонках типа ComboBox только на те значения, которые содержатся во второй таблице - справочнике.
0
 Аватар для Antykus
0 / 0 / 2
Регистрация: 10.05.2014
Сообщений: 230
29.11.2016, 13:48  [ТС]
Козадоев,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 public static DataTable dtTrips;
 public static DataTable dtUsers;
 
 static void TripsCreate()
        {
            dtTrips = new DataTable();
            dtTrips.Columns.Add("id", typeof(int));
            dtTrips.Columns.Add("id_natural", typeof(int)); // фио юзера
            dtTrips.Columns.Add("from_", typeof(string));
            dtTrips.Columns.Add("to", typeof(string));
            dtTrips.Columns.Add("date", typeof(DateTime));                      
            dtTrips.Columns.Add("date_arrive", typeof(DateTime));
            dtTrips.Columns.Add("train_num", typeof(string));
            dtTrips.Columns.Add("ticket_num", typeof(string));
            dtTrips.Columns.Add("doc_type", typeof(int));
            dtTrips.Columns.Add("doc_num", typeof(string));
            dtTrips.Columns.Add("comment", typeof(string));            
            dtTrips.Columns.Add("bonus_date", typeof(DateTime));
            dtTrips.Columns.Add("bonus_value", typeof(int));            
            dtTrips.Columns.Add("order_blank_path", typeof(string));
            // вычисляемые поля
            dtTrips.Columns.Add("able_to_earn_in", typeof(int));
            dtTrips.Columns.Add("bonused", typeof(bool), "IIF(bonus_value>0, true,false)");
 
            dtTrips.PrimaryKey = new DataColumn[] { dtTrips.Columns[0] };
            dtTrips.TableName = "Trips";
            dtTrips.Columns[0].AutoIncrement = true;
            dtTrips.Columns[0].AutoIncrementStep = 1;
            if (System.IO.File.Exists(dtTripsPath))
            {
                try
                {
                    dtTrips.ReadXml(dtTripsPath);
                }
                catch { }
            }
        }
 
  static void UsersCreate()
        {
            dtUsers = new DataTable();
            dtUsers.Columns.Add("id", typeof(int));
            dtUsers.Columns.Add("fio", typeof(string));
            dtUsers.Columns.Add("log_main", typeof(string));
            dtUsers.Columns.Add("pass_main", typeof(string));
            dtUsers.Columns.Add("log_bonus", typeof(string));
            dtUsers.Columns.Add("pass_bonus", typeof(string));
            dtUsers.Columns.Add("comment", typeof(string));
            dtUsers.PrimaryKey = new DataColumn[] { dtUsers.Columns[0] };
            dtUsers.TableName = "Users";
            dtUsers.Columns[0].AutoIncrement = true;
            dtUsers.Columns[0].AutoIncrementStep = 1;
            if (System.IO.File.Exists(dtUsersPath))
            {
                try
                {
                    dtUsers.ReadXml(dtUsersPath);
                }
                catch { }
            }
        }
 
 public static DataSet WorkDataset = new DataSet();
 
 public static void TablesInit()
        {
            TripsCreate();
            UsersCreate();
            UsersDocsCreate();
            // добавление таблиц в датасет
            WorkDataset.Tables.Add(dtTrips);
            WorkDataset.Tables.Add(dtUsers);
            WorkDataset.Tables.Add(dtUsersDocs);
            // добавление  связей в датасет
            WorkDataset.Relations.Add("user_rel",
                WorkDataset.Tables["Users"].Columns["id"],
                WorkDataset.Tables["Trips"].Columns["id_natural"]
                );
            // добавляем поле в поездки
            dtTrips.Columns.Add("id_dop", typeof(string), "Parent(user_rel).fio");
          
        }
Исходя из кода выше, если вас не затруднит, приведите пример строк, позволяющих сделать джоин из двух таблиц. Мне нужен именно пример кода
0
 Аватар для Козадоев
163 / 153 / 33
Регистрация: 05.03.2013
Сообщений: 876
29.11.2016, 14:03
Пожалуйста, вот код вырванный из файла DataSet1.Designer.cs
C#
1
2
3
this._commandCollection[1].CommandText = @"SELECT t1.ID, t1.DocName, t2.Name UserName FROM dbo.Documens t1
LEFT JOIN Users t2 ON t2.ID = t1.UserID 
WHERE t1.ID = @ID";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2016, 14:03
Помогаю со студенческими работами здесь

Как в один grid поместить данные из двух связанных таблиц MS SQL
У меня есть две таблички в одной из которых есть поле, в которое заносится id текущего пользователя, ну и соотвественно табличка(LOGINS),...

Как обновить данные полученные из двух связанных между собой таблиц?
Подкиньте если можно пример, что-то не могу разобраться как это реализовать:(

Проверка на уникальность двух полей из двух связанных таблиц
Есть поле id_1 в таблице name1, а также поле id_2 в таблице name2. Таблица name1 имеет отношение к таблице name2, как один ко многим. Как...

Выборка из двух связанных таблиц
Есть две таблицы связаны между собой как один к многим. Сделал выборку с помощью подзапроса. select c.id_t1, c.sn from table1 c ...

Как выбрать из двух "условно" связанных таблиц ?
День добрый! Задача состоит в следующем: Есть два таблицы: call_dump - тут фиксируются все входящие звонки - независимо,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru