Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160

DataRelation

08.08.2021, 09:05. Показов 6238. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При выполнении кода выскакивает ошибка System.Data.InvalidConstraintException: "Среди родительских столбцов и дочерних столбцов отсутствуют столбцы совпадающих типов."

C#
1
2
3
4
5
6
7
8
DataColumn parentCol = ds.Tables["ВыборМакроОбъект"].Columns["МакроКод"];
            DataColumn childCol = ds.Tables["ВыборСуперОбъект"].Columns["макрообъект"];
            DataColumn parentCol1 = ds.Tables["ВыборСуперОбъект"].Columns["СуперКод"];
            DataColumn childCol1 = ds.Tables["ВыборОбъект"].Columns["суперобъект"];
            DataRelation relation = new DataRelation("макрообъект", parentCol, childCol);
            DataRelation relation1 = new DataRelation("суперобъект", parentCol1, childCol1);
            ds.Relations.Add(relation);
            ds.Relations.Add(relation1);
Ошибка в 6 строке.

Таблицы:
T-SQL
1
2
3
4
5
6
7
8
CREATE TABLE [dbo].[ВыборМакроОбъект](
    [МакроКод] [int] IDENTITY(1,1) NOT NULL,
    [макрообъект] [nvarchar](255) NULL,
 CONSTRAINT [ВыборМакроОбъект$PrimaryKey] PRIMARY KEY CLUSTERED 
(
    [МакроКод] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
T-SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[ВыборСуперОбъект](
    [СуперКод] [int] IDENTITY(1,1) NOT NULL,
    [суперобъект] [nvarchar](255) NULL,
    [макрообъект] [int] NULL,
 CONSTRAINT [ВыборСуперОбъект$PrimaryKey] PRIMARY KEY CLUSTERED 
(
    [СуперКод] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
T-SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[ВыборОбъект](
    [ОбъектКод] [int] IDENTITY(1,1) NOT NULL,
    [объект] [nvarchar](100) NULL,
    [суперобъект] [int] NULL,
 CONSTRAINT [ВыборОбъект$PrimaryKey] PRIMARY KEY CLUSTERED 
(
    [ОбъектКод] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
В общем мне нужно определить зависимость трех таблиц (вообще четырех но это потом).
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.08.2021, 09:05
Ответы с готовыми решениями:

datagridview и datarelation
как заполнить datagridview ,если имеется 3 связанные таблицы посредством datarelation

Объект DataRelation, ссылающийся на себя
Добрый вечер. Изучаю ADO.NET по книжке, там есть пример демонстрирующий работу объекта DataRelation, который ссылается сам на себя....

Добавление строк в таблицу с использованием DataRelation
Есть три таблицы: users: CREATE TABLE `users` ( `id_user` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `id_type` int(11)...

37
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
08.08.2021, 11:45
Вам же уже говорилось, что решение - таблица-дерево, в которой два основных поля: собственный Id и Id родителя. Позволяет реализовать любое количество уровней.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
08.08.2021, 11:51  [ТС]
Ну и как мне его сделать, блин, как мне создать цикл foreah из той таблицы которую вы мне написали? во всех примерах которые я нашел только два уровня parent и child а как мне прикрутить третью и четвертую хрен где найдешь....
0
 Аватар для Andrey-MSK
3357 / 2243 / 388
Регистрация: 14.08.2018
Сообщений: 7,581
Записей в блоге: 4
09.08.2021, 08:30
Цитата Сообщение от aksident Посмотреть сообщение
только два уровня parent и child
Дак и продолжайте по аналогии связывать таблицы далее.
Если надо всё к первой привязать - то в каждой подчиненной таблице должен быть внешний ключ на первую, если надо последовательно - то связываются как первые две, только третья ко второй, четвертая к третьей и т.д.
А зачем вам это всё? Можно просто наделать запросы для подчиненных таблиц где условием будет внешний ключ на главную таблицу.
В первый грид привязываете первую таблицу, во второй вторую - на ней запрос с условием на ключ первой и т.д.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 08:35  [ТС]
Я пытаюсь создать дерево из связанных таблиц, но ни как не могу, толь начинаю осваивать C# везде примеры только из двух таблиц, а мне нужно их четырех
0
 Аватар для Andrey-MSK
3357 / 2243 / 388
Регистрация: 14.08.2018
Сообщений: 7,581
Записей в блоге: 4
09.08.2021, 09:58
Цитата Сообщение от aksident Посмотреть сообщение
T-SQL
1
[макрообъект] [int] NULL,
Вот такие поля, для связи, должны быть NOT NULL.
Для C# типint и int? разные вещи. Генератор кода, если я помню правильно, INT NOT NULL преобразует в int, а INT NULL в int?.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 10:02  [ТС]
так они и есть NOT NULL
0
 Аватар для Andrey-MSK
3357 / 2243 / 388
Регистрация: 14.08.2018
Сообщений: 7,581
Записей в блоге: 4
09.08.2021, 10:23
Цитата Сообщение от aksident Посмотреть сообщение
так они и есть NOT NULL
T-SQL
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[ВыборОбъект](
    [ОбъектКод] [int] IDENTITY(1,1) NOT NULL,
    [объект] [nvarchar](100) NULL,
    [суперобъект] [int] NULL, -- где тут NOT NULL? Это ведь поле для связи?
 CONSTRAINT [ВыборОбъект$PrimaryKey] PRIMARY KEY CLUSTERED 
(
    [ОбъектКод] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 10:25  [ТС]
а, запарился уже, в этом дело?
0
 Аватар для Andrey-MSK
3357 / 2243 / 388
Регистрация: 14.08.2018
Сообщений: 7,581
Записей в блоге: 4
09.08.2021, 10:30
Цитата Сообщение от aksident Посмотреть сообщение
а, запарился уже, в этом дело?
Ну посмотрите какой код сгенерировала студия для этих полей. Тип их (главного и подчиненного) должен быть одинаковый.
А вообще, если в БД были организованы связи, то мастер создания DataSet должен был сам их сделать в коде.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 10:37  [ТС]
спасибо
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
09.08.2021, 11:33
Лучший ответ Сообщение было отмечено aksident как решение

Решение

Цитата Сообщение от aksident Посмотреть сообщение
Ну и как мне его сделать, блин, как мне создать цикл foreah из той таблицы которую вы мне написали? во всех примерах которые я нашел только два уровня parent и child а как мне прикрутить третью и четвертую хрен где найдешь....
Все лежит в единственной таблице в виде иерархии сущностей.
Пример такой таблицы:
SQL
1
2
3
4
5
6
CREATE TABLE ArmyStruct (
    Id INT IDENTITY(1,1)  PRIMARY KEY,
    PId INT NULL, 
    Level INT NOT NULL,
    Name VARCHAR(MAX)
)
Данные в таблице:
C#
1
2
3
4
5
6
7
8
9
10
11
  Id   PId   Level  Name
---------------------------
  1    null     0  Дивизия
  2      1      1   Полк 1
  3      1      1   Полк 2
  4      2      2   Рота 11
  5      4      3   Взвод 111
  6      2      2   Рота 12
  7      3      2   Рота 21
  8      5      4   Отделение 1111
  9      7      3   Взвод 211
Добавлено через 6 минут
Для выборки данных две техники:
1. Выборка дочек
SQL
1
SELECT * FROM ArmyStruct WHERE PId = 1  -- Все полки дивизии
2. Выборка всего дерева либо по узлу всех потомков вплоть до листьев (листьями называются узлы, не имеющие дочек, например, отделения). Тут используется рекурсия.
Пример:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE FUNCTION [dbo].[getallnodesidbynodeid]
(   
    @NodeId INT
)
RETURNS TABLE 
AS
RETURN 
(
     WITH tree (id, pid, "name") AS (
        SELECT T1.TA_ID, T1.TA_PID, T1.TA_Name
        FROM TREEANIMALS T1
        WHERE T1.TA_PID = @NodeID OR (T1.TA_PID IS NULL AND @nodeId IS NULL)
        UNION ALL
 
        SELECT T2.TA_ID, T2.TA_PID, T2.TA_Name
        
        FROM 
           TREEANIMALS T2 INNER JOIN tree T ON T.id = T2.TA_PID
      )
      SELECT * FROM tree T 
      UNION
      SELECT @NodeID AS id, (SELECT T.TA_PID AS pid FROM TREEANIMALS T WHERE T.TA_ID = @NodeID), 'ROOT NODE'
)
1
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 11:39  [ТС]
О, наконец то! Спасибо огрмадное за помощь! А не подскажите как мне собрать такую табличку из моих таблиц?

Добавлено через 4 минуты
по предыдущему вашему совету создал такую
T-SQL
1
2
3
4
5
6
CREATE TABLE [dbo].[treepodrazd](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [макрообъект] [nvarchar](255) NULL,
    [суперобъект] [nvarchar](255) NULL,
    [объект] [nvarchar](100) NULL
) ON [PRIMARY]
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
09.08.2021, 11:43
В приложении запускается запрос и сканируется полученный НД и в TreeView добавляются узлы:
- Если вариант 1 (подкачка дочек узла), то для каждой записи добавляете узел-дочку в раскрываемый узел-папу.
- Если вариант 2 (подкачка всего узла со всеми потомками), то сначала проверяете уровень и, если он изменился, то дочка добавляется к предыдущему добавленному узлу (внучка), иначе - как в случае 1 добавляем сестричку. Естественно, набор данных должен быть правильно отсортирован.
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 11:47  [ТС]
В том то и дело что нигде не могу найти пример как реализовать добавление третьего уровня к дереву, везде только два.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
09.08.2021, 11:48
aksident, Понятия "макро", "супер" и т.д. лишние. Все определяется уровнем. Т.е. в Вашем случае "супер" - это уровень 0, "макро" - уровень 1, "объект" - уровень 2.
Если появятся более низкие уровни ("субобъект", "миниобъект", "микрообъект" и т.д.), то они просто добавятся в соответствующие родительские узлы с уровнем 3,4,5...
В TreeView все это будет выглядеть как иерархия. Очень похоже на папки диска в обозревателе папок Windows
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 11:53  [ТС]
А пример кода можно какойнибудь? я только начинаю постигать C#, и SQL а постигать легче на примерах.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
09.08.2021, 11:54
Цитата Сообщение от aksident Посмотреть сообщение
В том то и дело что нигде не могу найти пример как реализовать добавление третьего уровня к дереву, везде только два.
Добавление нового взвода к роте21:
SQL
1
2
INSERT INTO ArmyStruct (PId, Name) 
  VALUES ((SELECT Id FROM ArmyStruct WHERE Name="Рота 21"), "Взвод 212")
или, если добавление в узел дерева с "Рота 21" и id его известно (т.к. предусмотрительно запомнено в св-ве object узла, то
SQL
1
2
INSERT INTO ArmyStruct (PId, Name) 
  VALUES (@pid, "Взвод 212"),
где @pid = id узла, куда добавляется новая дочка
0
0 / 0 / 0
Регистрация: 22.10.2018
Сообщений: 160
09.08.2021, 11:56  [ТС]
Как добавить строки и значения я знаю
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
09.08.2021, 12:00
aksident, Все зависит от того, что Вы собираетесь делать с деревом в приложении.
Если отображать, то опять-таки зависит от типа приложения.
Смею предположить, что у Вас winforms, поэтому используется стандартный элемент TreeView. Как с ним работать - почитайте в инете - примеров масса.
Для добавления/редактирования советую использовать модальную форму. Текущий узел TreeView при добавлении будет "папой". Все как обозревателе Windows
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.08.2021, 12:00
Помогаю со студенческими работами здесь

DataAdapter методом Fill выгружает в DataSet DataRelation?
Если таблицы связаны и я методом Fill выгружаю их в DataSet то помимо объектов DataTable создаются ли объекты DataRelation дублирующие...

VB. NET - Зависимые ComboBox + БД / DataRelation
Привет всем. Есть на форме два комбо-бокса, итемы в них загружаются из базы данных из двух таблиц - в один комбо - некоторые указатели, в...

DataRelation для трех таблиц
Всех приветствую! Есть три таблицы. Первая таблица - пользователи. Вторая таблица - заказы. Третья таблица - id пользователя и...

Как привязать данные используя DataRelation
Привет! Очень нужна помощь в несложной задаче: Есть DataSet, который состоит из 2-х таблиц: Category (CategoryID, CategoryName) ...

Как привязать данные используя DataRelation
Привет! Очень нужна помощь в несложной задаче: Есть DataSet, который состоит из 2-х таблиц: Category (CategoryID, CategoryName) ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru