Как связать таблицы в c

Обновлено: 24.04.2024

Подскажите пожалуйста, что бы я разобрался.
Имеется такая схема данных, в проекте хочу показать следующее, на форме имеется два Грида в Левом список спектаклей в Правом список всех актеров, хочу чтобы при выборе спектакля в Левом гриде в правом отображались только те актеры кто играет в данном спектакле, подскажите что для этого надо сделать.

Сохранить связанные таблицы
Добрый день! Помогите пожалуйста новичку. Уже которые день не могу разобраться. Перерыл кучу.

Связанные таблицы на разных формах
Не получается реализовать связанность таблиц на разных формах. Я создала предварительно бд и связь.

Имеется такая схема данных, в проекте хочу показать следующее, на форме имеется два Грида в Левом список спектаклей в Правом список всех актеров, хочу чтобы при выборе спектакля в Левом гриде в правом отображались только те актеры кто играет в данном спектакле, подскажите что для этого надо сделать.

Если вы используете DataSet и DataTable, то это делается через задание связи DataSet.Relations.
Пример:

(в примере таблицы создаются вручную, но вам конечно нужно заполнять таблицы из вашей базы данных)

В дополнение к запросам к одной таблице можно также выполнять запросы между таблицами в LINQ to DataSet. Это делается с помощью объединения. Соединение представляет собой взаимосвязь объектов одного источника данных с объектами, использующими общий атрибут, например идентификатор продукта или контактного лица, в другом источнике данных. В объектно-ориентированном программировании связи между объектами относительно просты для навигации, поскольку каждый объект имеет член, ссылающийся на другой объект. Однако в таблицах внешних баз данных перемещение по связям не столь однозначно. Таблицы баз данных не содержат встроенных связей. В таких случаях для соединения элементов из разных источников может использоваться операция объединения. Например, если две таблицы содержат данные о продуктах и о продажах, нужно использовать операцию соединения для сопоставления данных о продажах и о продуктах, относящихся к одному и тому же заказу на продажу.

Платформа Language-Integrated query (LINQ) предоставляет два оператора Join: Join и GroupJoin . Эти операторы выполняют эквивалентные объединения: то есть объединения, которые соответствуют двум источникам данных, только если их ключи равны. (напротив, Transact-SQL поддерживает операторы join, отличные от equals , например less than оператор.)

В терминах реляционной базы данных оператор Join выполняет внутреннее соединение. Внутреннее соединение представляет собой соединение, при котором возвращаются только объекты, имеющие соответствия в другом наборе данных.

GroupJoinОператоры не имеют прямого эквивалента в терминах реляционной базы данных; они реализуют надмножество внутренних соединений и левых внешних соединений. Левое внешнее соединение — это соединение, возвращающее каждый элемент первой (левой) коллекции, даже если в второй коллекции нет коррелированных элементов.

Дополнительные сведения о объединениях см. в разделе операции JOIN.

Пример

В следующем примере выполняется традиционное соединение таблиц SalesOrderHeader и SalesOrderDetail из образца базы данных AdventureWorks для получения заказов, сделанных через Интернет начиная с августа.

в этом пошаговом руководстве демонстрируется использование ассоциаций LINQ to SQL для представления связей внешнего ключа в базе данных.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Предварительные условия

Обзор

Данное пошаговое руководство состоит из трех основных задач.

Добавление класса сущности, который представляет таблицу "Orders" в базе данных "Northwind".

Добавление примечаний к классу Customer , чтобы расширить связи между классами Customer и Order .

Создание и выполнение запроса для тестирования процесса получения сведений о классе Order с помощью класса Customer .

Сопоставление связей между таблицами

После определения класса Customer создайте определение класса сущностей Order , включающее следующий код, который указывает, что свойство Order.Customer связано как внешний ключ со свойством Customer.CustomerID .

Добавление класса сущностей "Order"

Введите или вставьте следующий код после определения класса Customer .

Добавление примечаний к классу "Customer"

На этом этапе добавляются примечания к классу Customer , чтобы указать его связь с классом Order . (Это добавление не является обязательным, поскольку определение связи в любом направлении достаточно для создания ссылки. Но добавление этой заметки позволяет легко перемещаться по объектам в любом направлении.)

Добавление примечаний к классу "Customer"

Введите или вставьте следующий код в класс Customer .

Создание и выполнение запроса в рамках связи "Customer-Order"

Теперь можно получить доступ к объектам Order непосредственно из объектов Customer или в обратном направлении. Явное соединение между клиентами и заказами не требуется.

Получение доступа к объектам "Order" с помощью объектов "Customer"

Измените метод Main посредством ввода или вставки в метод следующего кода:

Нажмите клавишу F5, чтобы начать отладку приложения.

Чтобы избежать отображения кода SQL в окне "Консоль", преобразуйте db.Log = Console.Out; в комментарий.

Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.

Создание строго типизированного представления базы данных

Общая процедура становится гораздо проще, если в начале использовать строго типизированное представление базы данных. Задавая строгую типизацию объекта DataContext, можно избежать вызовов метода GetTable. Строго типизированные таблицы можно использовать в запросах только при использовании строго типизированного объекта DataContext.

В представленных ниже шагах создается объект Customers в качестве строго типизированной таблицы, которая сопоставляется с таблицей "Customers" в базе данных.

Установка строгой типизации объекта "DataContext"

Добавьте следующий код непосредственно перед объявлением класса Customer .

Измените метод Main , чтобы использовать строго типизированный объект DataContext, как показано далее.

Нажмите клавишу F5, чтобы начать отладку приложения.

В окне «Консоль"» отобразится следующее.

Чтобы остановить отладку, в окне консоли нажмите клавишу ВВОД.

Next Steps

Набор данных, содержащий связанные таблицы данных, использует DataRelation объекты для представления связи «родители-потомки» между таблицами и для возвращения связанных записей друг от друга. При добавлении связанных таблиц в наборы данных с помощью мастера настройки источника или Конструктор наборов данных создает и настраивает DataRelation объект.

DataRelationОбъект выполняет две функции:

Он может сделать доступными записи, связанные с записью, с которой вы работаете. Он предоставляет дочерние записи в родительской записи ( GetChildRows ) и родительской записи при работе с дочерней записью ( GetParentRow ).

Он может применять ограничения для ссылочной целостности, например удалять связанные дочерние записи при удалении родительской записи.

Важно понимать разницу между истинным соединением и функцией DataRelation объекта. В случае истинного объединения записи берутся из родительской и дочерней таблиц и помещаются в один плоский набор записей. При использовании DataRelation объекта новый набор записей не создается. Вместо этого DataRelation отслеживает связь между таблицами и сохраняет синхронизацию родительских и дочерних записей.

Объекты и ограничения DataRelation

DataRelationОбъект также используется для создания и принудительного применения следующих ограничений.

Ограничение UNIQUE, которое гарантирует, что столбец в таблице не содержит дубликатов.

Ограничение внешнего ключа, которое можно использовать для поддержания ссылочной целостности между родительской и дочерней таблицами в наборе данных.

Ограничения, указываемые в DataRelation объекте, реализуются путем автоматического создания соответствующих объектов или настройки свойств. При создании ограничения внешнего ключа с помощью DataRelation объекта экземпляры ForeignKeyConstraint класса добавляются в DataRelation ChildKeyConstraint свойство объекта.

Ограничение UNIQUE реализуется либо путем простого присвоения Unique свойству столбца данных значения true или путем добавления экземпляра UniqueConstraint класса к DataRelation ParentKeyConstraint свойству объекта. Сведения о приостановке ограничений в наборе данных см. в разделе Отключение ограничений при заполнении набора данных.

Правила ссылочной целостности

В рамках ограничения внешнего ключа можно указать правила ссылочной целостности, применяемые в трех точках:

При обновлении родительской записи

При удалении родительской записи

Когда изменение принято или отклонено

Правила, которые можно сделать, указаны в Rule перечислении и перечислены в следующей таблице.

Правило ограничения внешнего ключа Действие
Cascade Изменения (обновление или удаление), внесенные в родительскую запись, также вносятся в связанные записи в дочерней таблице.
SetNull Дочерние записи не удаляются, но внешний ключ в дочерних записях имеет значение DBNull . С помощью этого параметра дочерние записи можно оставить как потерянные, т. е. они не имеют связи с родительскими записями. Примечание. Использование этого правила может привести к недопустимым данным в дочерней таблице.
SetDefault Внешнему ключу в связанных дочерних записях присваивается значение по умолчанию (как установлено DefaultValue свойством столбца).
None В связанные дочерние записи не вносятся изменения. При использовании этого параметра дочерние записи могут содержать ссылки на недопустимые родительские записи.

Дополнительные сведения об обновлениях в таблицах наборов данных см. в разделе Сохранение данных в базе данных.

Отношения только для ограничений

При создании DataRelation объекта можно указать, что отношение должно использоваться только для принудительного применения ограничений, то есть оно также не будет использоваться для доступа к связанным записям. Этот параметр можно использовать для создания набора данных, который является немного более эффективным и содержит меньше методов, чем один с возможностью связанных записей. Однако доступ к связанным записям будет невозможен. Например, отношение только с ограничением не позволяет удалить родительскую запись, которая по-прежнему имеет дочерние записи, и вы не сможете получить доступ к дочерним записям через родительский элемент.

Создание связи данных вручную в конструктор наборов данных

при создании таблиц данных с помощью средств проектирования данных в Visual Studio связи создаются автоматически, если данные могут быть собраны из источника данных. При добавлении вручную таблиц данных из вкладки набор данных панели элементов может потребоваться создать связь вручную. Сведения о создании DataRelation объектов программным путем см. в разделе Добавление связейданных.

Связи между таблицами данных отображаются в виде линий в Конструктор наборов данных с глифом "один ко многим". По умолчанию имя связи не отображается в области конструктора.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в этой статье. Возможно, вы используете другой выпуск Visual Studio или другие параметры среды. Дополнительные сведения см. в разделе Персонализация среды IDE.

Создание связи между двумя таблицами данных

Откройте свой набор данных в Конструкторе наборов данных. Дополнительные сведения см. в разделе Пошаговое руководство. Создание набора данных в конструктор наборов данных.

Перетащите объект связи с панели элементов набора данных на дочернюю таблицу данных в связи.

Откроется диалоговое окно связь с заполнением поля дочерней таблицы таблицей, в которую перетаскивается объект связи .

Выберите родительскую таблицу из поля Родительская таблица . Родительская таблица содержит записи на стороне «один» связи «один ко многим».

Убедитесь, что в поле дочерняя таблица отображается правильная дочерняя таблица. Дочерняя таблица содержит записи на стороне «многие» связи «один ко многим».

Введите имя связи в поле имя или оставьте имя по умолчанию на основе выбранных таблиц. Это имя фактического DataRelation объекта в коде.

Выберите столбцы, которые объединяют таблицы в списках Ключевые столбцы и Внешние ключевые столбцы .

Выберите, следует ли создать связь, ограничение или и то, и другое.

Установите или снимите флажок Вложенная связь . При выборе этого параметра свойству присваивается значение Nested true , после чего дочерние строки отношения вкладываются в родительский столбец, когда эти строки записываются в виде XML-данных или синхронизируются с XmlDataDocument . Дополнительные сведения см. в разделе вложенность связейданных.

Задайте правила, которые должны применяться при внесении изменений в записи в этих таблицах. Для получения дополнительной информации см. Rule.

Отображение имени отношения в конструктор наборов данных

Откройте свой набор данных в Конструкторе наборов данных. Дополнительные сведения см. в разделе Пошаговое руководство. Создание набора данных в конструктор наборов данных.

В меню данные выберите команду Показать связи меток , чтобы отобразить имя связи. Очистите эту команду, чтобы скрыть имя связи.

DataSet может содержать множество таблиц, которые могут быть связаны различными отношениями. Например, пусть у нас в dataset будет определена таблица производителей смартфонов и таблица самих смартфонов, которая связана с первой:

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

Ключевым моментом здесь является установка отношения между таблицами:

Первым параметром здесь идет название отношения, по которому потом на него можно будет ссылаться. Вторым параметром идет главный столбец - id компании в таблице компаний. Третий параметр - подчиненный столбец - id компании в таблице смартфонов. Подчиненный столбец зависит от главного. Вместо этих параметров мы можем передать объект DataRelation, который также будет иметь данные значения.

Затем используя отношение, мы можем получить для одной строки из таблицы компаний связанные строки из таблицы смартфонов:

Внешние ключи

Кроме простого отношения между таблицами мы также можем задать внешние ключи, как в обычных базах данных. Для этого непосредственно перед строкой:

Добавим следующий код:

Внешний ключ представляет объект ForeignKeyConstraint, в конструктор которого передается два параметра: главный столбец и зависимый столбец. В данном случае это те же самые столбцы.

Также у него мы можем установить ряд свойств. Через свойство ConstraintName устанавливается название внешнего ключа. Свойства DeleteRule и UpdateRule определют поведение при удалении или обновлении данных соответственно в главной таблице (то есть в данном случае в таблице компаний). Эти свойства принимают одно из значений перечисления Rule:

Cascade : происходит автоматическое изменение или удаление строк в подчиненной таблице

None : строки в подчиненной таблице не изменяются

SetDefault : происходит установка значений по умолчанию для связанных строк (которое определяется через DataColumn.DefaultValue)

SetNull : для связанных строк устанавливается значение DBNull

С помощью метода ds.Tables["Phones"].Constraints.Add(foreignKey); внешний ключ добавляется к таблице смартфонов. И затем через выражение ds.EnforceConstraints = true; происходит применение внешнего ключа.

И если мы удалим, например, одну из строк из таблицы компаний, то в таблице смартфонов все строки, которые связаны с удаленной, в столбце CompanyId будут иметь значение null.

Читайте также: