Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Топ:
Методика измерений сопротивления растеканию тока анодного заземления: Анодный заземлитель (анод) – проводник, погруженный в электролитическую среду (грунт, раствор электролита) и подключенный к положительному...
Особенности труда и отдыха в условиях низких температур: К работам при низких температурах на открытом воздухе и в не отапливаемых помещениях допускаются лица не моложе 18 лет, прошедшие...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Интересное:
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
2022-09-11 | 25 |
5.00
из
|
Заказать работу |
|
|
Связь (relationship) между первой таблицей Studs и второй — Exams имеет вид один ко многим. В реальной базе данных это, как вы знаете, означает, что первичные ключи первой таблицы неоднократно скопированы во вторую и эти копии носят имя связанных ключей (foreign keys). Они ссылаются на строки главной, первичной таблицы, образуя ссылочную целостность данных (referential integrity: каждый экзамен принадлежит какому-то студенту).
Для того, чтобы создать подобную структуру связей в DataSet, необходимо (кроме двух объектов DataTable) добавить объект класса DataRelation. Ссылка на этот объект помещается и хранится в коллекции Relations объекта DataSet. При создании DataRelation надо указать связываемые колонки и задать имя связи. Имя играет решающую роль в настройке механизма DataBinding (так же, как и имена синхронизируемых свойств).
Следующий фрагмент надо добавить в метод RelateAndBind, который вызывается после InitDataSet.
ds.Relations.Add(new DataRelation("StudExam", ds.Tables[0].Columns[0], ds.Tables[1].Columns[1]));
Здесь создается и помещается в коллекцию Relations объект класса DataRelation. Этог код необходим для синхронизации отображения данных связанных таблиц. Суть синхронизации в том, что вторая таблица должна отображать не все экзамены, а только экзамены студента, активного (выбранного) в первой таблице. С этой задачей справится механизм DataBinding, которому надо дать ссылку на DataRelation.
Добавляем ограничение
Если мы хотим не только просматривать данные, но и вносить изменения, то для сохранения целостности по ссылкам, необходимо добавить код, создающий объект класса ForeignKeyConstraint. Он задает ограничение, накладываемое на данные обеих таблиц. Ограничение (constraint) типа FK-PK (ForeignKey-PrimaryKey) следит за тем, чтобы не нарушалась целостность данных по ссылкам. Следующий фрагмент надо добавить в метод RelateAndBind (до создания DataRelation).
|
ForeignKeyConstraint cs = new ForeignKeyConstraint("SE", ds.Tables[0].Columns[0], ds.Tables[1].Columns[1]);
cs.DeleteRule = Rule.Cascade;
cs.UpdateRule = Rule.Cascade;
ds.Tables[1].Constraints.Add(cs);
ds.EnforceConstraints = true;
Здесь мы создаем объект класса ForeignKeyConstraint, настраиваем его и вставляем в коллекцию Constraints подчиненной таблицы. Последний оператор включает ограничения. Иногда их надо выключать, например, при начальном заполнении таблицы, или при чтении данных из файла. В эти моменты целостность данных по ссылкам (временно) может отсутствовать. По завершении этих операций ограничения следует вновь включить.
Вторая, подчиненная таблица
В класс формы уже имеется массив с именами курсов лекций:
static string[] courses = { "Math", "Mechanics", "Physics", "English", "Oracle", "OpenGL", "History" };
Объект Random rand уже объявлен нами, но еще не создан. Он позволит сгенерировать случайные параметры для строк таблицы экзаменов.
· Создайте объект rand в подходящий момент жизни приложения.
· Добавьте в InitTables код заполнения таблицы экзаменов (двойной цикл по студентам и по курсам лекций). Для каждого студента сгенерируйте случайное количество сданных экзаменов, случайные даты и оценки. Пользуйтесь методами класса Random.
Подсказка. Добавьте код внутрь метода InitTables.
foreach (object[] stud in studs)
{
int num = 0;
foreach (string c in courses)
{
if (num++!= rand.Next(courses.Length))
ds.Tables[1].Rows.Add(CreateRandomExam((int)stud[0], c));
}
}
Доработайте код метода CreateRandomExam.
DataRow CreateRandomExam(int studID, string course)
{
// Такой способ создания строки надежен, так как новая строка уже имеет определенный нами ранее набор колонок
DataRow row = ds.Tables[1].NewRow();
row[1] = studID;
row[2] = course;
row[3] = // Напишите логическое выражение (сдал-ли студент зачет). Успех должен быть в 90% случаев.
row[4] = 2;
if ((bool)row[3])
{
row[4] = // Используйте rand
row[5] = // Новая дата, отстающаяся от DateTime.Now на случайное число лет (не более 2), случайный месяц и день
}
return row;
}
Привяжите gridExam к данным таблицы Exams. Вы можете выбрать ее из DataSet (ds.Tables[1]). Отладьте приложение так, чтобы оно позволяло работать с данными двух таблиц. Для начала пусть оба компонента DataGridView отображают все данные таблиц, к которым они привязаны.
|
|
Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!