Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Отношение между таблицами

25.10.2016, 21:26. Показов 2428. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Такой вопрос. Хочу создать отношение между двумя таблицами по foreign key.
К примеру таблицы:

SQL
1
2
3
4
5
CREATE TABLE [dbo].[Firm]
(
    [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(), 
    [firm] NVARCHAR(50) NULL
)
SQL
1
2
3
4
5
6
7
CREATE TABLE [dbo].[Person]
(
    [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(), 
    [name] NVARCHAR(50) NULL, 
    [id_firm] UNIQUEIDENTIFIER NULL, 
    CONSTRAINT [FK_Person_ToFirm] FOREIGN KEY ([id_firm]) REFERENCES [Firm]([id])
)
Короче создаю локальную базу данных; создаю там две эти таблицы; затем создаю источник данных DataSet, привязываю его к базе. Все по стандарту :-)
Затем в вкладке Data Sources вижу свой DataSet с таблицами, и начинаю переносить эти таблицы на форму - в итоге получаю два DataGridView на форме, привязанные к DataSet через BindingSource.

Теперь запускаю прогу. Все работает... НО по идеи когда я должен нажимать на разные строки в DataGridView, который отображает таблицу Firm, должна проходить выборка по ключу в DataGridView, который отображает Person, и показывать мне только те строки, которые соответствуют правилам id(Firm) = id_firm(Person)
Но у меня никакая выборка не происходит - просто все строки отображаются как в одном DataGridView, так и в другом. В чем может быть проблема, не подскажете?

Вопрос №2(Задаю его здесь же, так как очень два вопроса связаны между собой):
Опять же отношение между таблицами. Таблицы те же, что я описывал выше. Только теперь есть на форме TabControl, который будет нести смысл первой таблицы - TabPages.text отображать поле firm из таблицы Firm. Также есть один DataGridView, который отображает таблицу Person и находится в TabControl.
Нужно сделать так, чтобы при переходе с TabPage на другую TabPage происходила выборка по ключу, и отображала соответствующую информацию в DataGridView.
Короче все тоже самое что и в Вопросе 1, только место одного DataGridView у нас TabControl.

P.S. можно сделать тупо через DataView выборку, но это глупо...зачем тогда эти отношения вообще нужны, если все автоматически не работает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.10.2016, 21:26
Ответы с готовыми решениями:

Отношение между таблицами
Есть какой- то класс, который мог сливать БД в DataSet таблицы с отношениями? что бы их в ручную не писать

Отношение между двумя таблицами
Привет всем. Есть две таблицы - Card и Pooshren. У Card есть первичный ключ(столбец itemperson). У pooshren есть столбец itemparent - это...

Отношение между несколькими таблицами
Привет всем. Тема в принципе похожа на предыдущую, но все же отличается. Итак, есть три таблицы - Data, History, TypeHistory. Data,...

8
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
26.10.2016, 09:03
FK нужны для обеспечения целостности данных, а не для того, что вы подумали
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.10.2016, 09:13  [ТС]
Ну что, кто нибудь поможет? Вот даже видео записал, чтобы более понятнее было мою проблему:
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
26.10.2016, 09:23
master/detail это называется. И FK тут вовсе не причем. Однако благородный дон не желает читать ответы
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.10.2016, 21:33  [ТС]
pincet, я не увидел Ваш первый пост. Извините. А что такое master/detail и как его организовать?
И что по поводу второго вопроса? Как привязать таблицу к TabControl

Добавлено через 12 часов 5 минут
Короче сделал сам. Оказывается нужно было привязать BindingSource у зависимой таблицы к независимой, и выставить поле DataMember на внешний ключ зависимых таблиц:
C#
1
2
personBindingSource.DataSource = firmBindingSource;
personBindingSource.DataMember = "FK_Person_ToFirm";
где
personBindingSource - BindingSource зависимой таблицы Person
firmBindingSource - BindingSource зависимой таблицы Firm
FK_Person_ToFirm - внешний ключ

Но теперь вопрос другой, к примеру у меня есть еще одна таблица Сity, которая имеет такую структуру:
SQL
1
2
3
4
5
CREATE TABLE [dbo].[City]
(
    [id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY DEFAULT NEWID(), 
    [city] NVARCHAR(50) NULL
)
В таблице Person появилось поле id_city, которое соответственно привязывается по внешнему ключу к id из таблицы City.
Нужно сделать так, чтобы ТАКЖЕ АВТОМАТОМ, при выводе в DataGridView таблицы Person, место столбца id_city показывался город, соответствующий данному ключу. Как такое организовать?
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
27.10.2016, 10:50
Цитата Сообщение от Bretbas Посмотреть сообщение
Как такое организовать?
Используйте DataGridViewComboBoxColumn. Это тип столбца в DataGridView. Устанавливаете у него свойства
DataSource -источник данных
ValueMember -поле, в котором отображается значение. Название города в вашем случае.
DisplayMember - поле, в котором находится идентификатор. id_city.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
27.10.2016, 22:54  [ТС]
Igr_ok, да так прокатило) но с DataGridViewComboBoxColumn как то глупо выглядит, так как там не список, а одно значение. Нужно скорее всего DataGridViewTextBoxColumn, но к нему почему то нет привязки(

Добавлено через 7 минут
Блин, решил одну проблему, появилась новая.
Короче есть те же 2 таблицы - Firm, Person. Firm привязана к ComboBox, Person - к DataGridView. Все нормально работает, при переходе с пункта на пункт в ComboBox строки в DataGridView фильтруются. Все как надо...
Тут решил организовать поиск по таблице Person. Создал TextBox, в событии TextChanged пишу такой код:
C#
1
2
3
4
5
6
7
8
...
private void textBox1_TextChanged(object sender, EventArgs e)
{    
DataView MyDataView = new DataView(this.DataSet.Person);   
MyDataView.RowFilter = "name LIKE '" + textBox1.Text + "%'";
this.personBindingSource.DataSource = MyDataView;
}
...
Фильтрация строк проходит, но он ищет уже по всем строкам из таблицы Person, не учитывая что она зависима от Firm. Мне нужно организовать поиск, чтобы выводила только те строки, которые проходят валидацию при фильтре + которые относятся к текущей строке из Firm(ComboBox)
Попробовал сделать вот так:
C#
1
2
3
4
5
6
7
8
...
private void textBox1_TextChanged(object sender, EventArgs e)
{    
DataView MyDataView = new DataView(this.DataSet.Person);
MyDataView.RowFilter = "name LIKE '" + textBox1.Text + "%' AND id_firm = '" + this.firmComboBox.SelectedValue + "'";
this.personBindingSource.DataSource = MyDataView;
}
...
При таком коде все нормально работает, тоесть ищет только те строки, которые проходят валидацию и относятся к данной строке из Firm(ComboBox)...
НО при переходе на другой пункт из ComboBox перестает обновляться DataGridView %) Жесть какая то.
Я так понимаю при передачи
this.personBindingSource.DataSource = MyDataView;
сбивается вот привязка по ключу в
DataGridViewthis.personBindingSource.Dat aMember = "FK_Person_ToFirm";
this.personBindingSource.DataSource = this.firmBindingSource;
Я уже с ума схожу с этим GUI С C# вообще на "Вы", но нужно написать Помогите решить проблему, так как я даже не знаю как правильно в гугл обратиться с этим вопросом
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
28.10.2016, 08:43
потому, что нужно забыть про всякую ерунду типа BindingSource и иже с ним и получать с сервера готовые наборы данных. Это раз
Изучить JOIN, это 2
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
28.10.2016, 23:04  [ТС]
pincet, если получать с сервера наборы данных, то это намного будет тормозить программу. Легче грузануть все в DataSet при открытии программы, и при закрытии сохранять уже все...ну это на мой взгляд...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2016, 23:04
Помогаю со студенческими работами здесь

Отношение между таблицами в типизированном DataSet
Ув. сообщество, подскажите, пожалуйста, как мне решить мою проблемку. Для доступа к БД Access я использую типизированный DataSet,...

Связи между таблицами
использую VS win forms и sql server, где лучше хранить связи таблиц? на sql server?

Связи между таблицами
Кто нибудь сталкивался с выводом связей таблиц? То есть на форме есть кнопка, при ее нажатии выводит связь между таблицами. Как это...

Связи между таблицами
Знающие ребята, подскажите пожалуйста, правильно ли я связал следующие таблицы? Или же эти связи в sql server management бесполезны?...

Связи между таблицами в Code First
Всем доброго времени суток! Не получается создать связи между такими таблицами (многие-ко-многим): Developer(Id, ...), Customer(Id,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru