![](/user_photo/2706_HbeT2.jpg)
- •Лабораторная работа №6. Доступ к данным с помощью технологии ado.Net
- •1. Цель работы
- •2. Сведения из теории
- •2.1. Типы пространства имен System.Data
- •2.5. Возможности класса DataSet
- •2.6. Класс DataRelation
- •3. Пример выполнения работы
- •3.1. Визуальное проектирование диалогового окна
- •3.2. Проектирование программного кода
- •3.2.1. Обновление содержимого главного окна приложения
- •3.2.2. Добавление нового контакта
- •3.2.3. Добавление номера телефона
- •3.2.4. Выбор записей в таблицах
- •3.2.5. Редактирование записей таблицы Contacts
- •3.2.6. Изменение номера телефона
- •3.2.7. Удаление записей таблицы Contacts
- •If (MessageBox.Show("Вы действительно хотите удалить
- •3.2.8. Удаление номера телефона
- •If (MessageBox.Show("Вы действительно хотите удалить
- •3.2.9. Фильтрация данных
- •4. Задание для самостоятельной работы
2.6. Класс DataRelation
После того как в DataSet появилось несколько объектов таблиц, можно определить отношения между этими таблицами. Объектно-ориентированную оболочку вокруг отношений между таблицами представляет класс DataRelation. При создании объекта этого класса необходимо указать имя отношений, а также родительскую и подчиненную таблицы. Чтобы отношение было успешно установлено, в каждой из таблиц должен быть столбец с одинаковым названием и типом данных.
Объекты DataRelation хранятся в коллекции DataRelationCollection, поддерживаемой DataSet. В типе DataRelation предусмотрены свойства, которые позволяют получать ссылки на родительскую и подчиненную таблицу, участвующую в отношении, определять имя отношения и т.п. Наиболее часто используемые свойства представлены в таблице:
Свойство |
Описание |
ChildColumns ChildKeyConstraint ChildTable |
Позволяют получить информацию о подчиненной таблице, участвующей в отношении, а также ссылку на саму эту таблицу |
DataSet |
Позволяет получить ссылку на объект DataSet, к которому принадлежит данное отношение |
ParentColumns ParentKeyConstraint ParentTable |
Позволяют получить информацию о родительской таблице, участвующей в отношении, а также ссылку на саму эту таблицу |
RelationName |
Позволяет получить или задать имя для данного отношения |
Перемещение между таблицами производится при помощи методов, определенных в классе DataRow. Так, метод GetChildRows() позволяет считывать строки из подчиненной таблицы, а метод GetParentRows() – из родительской таблицы.
3. Пример выполнения работы
Задание. Реализовать с помощью технологии ADO.NET программный интерфейс управления базой данных, созданной в предыдущей лабораторной работе. Предусмотреть возможность добавления, редактирования, удаления, фильтрации записей.
3.1. Визуальное проектирование диалогового окна
Внешний вид работающего приложения приведен на рисунке 8.3.
Настройки таблиц dataGridView1 и dataGridView1 приведены в описании предыдущей лабораторной работы.
Текстовые поля FamTextBox и NameTextBox используются для добавления новой записи или редактирования записи, выделенной в таблице. Для удобства редактирования при выделении строки в таблице данные об имени и фамилии человека копируются в соответствующие текстовые поля.
Текстовое
поле FamTextBox
Таблица dataGridView1
Текстовое
поле PhoneTextBox
Таблица dataGridView2
Текстовое
поле NameTextBox
Список FamComboBox
Кнопка AddContactButton
Кнопка
EditButton
Кнопка
DelContactButton
Флажок
FilterCheckBox
Кнопка
AddPhoneButton
Кнопка
EditPhoneButton
Кнопка
DelPhoneButton
Рис. 8.3. Главная форма приложения
3.2. Проектирование программного кода
3.2.1. Обновление содержимого главного окна приложения
Обновлять содержимое главного окна необходимо, когда пользователь производит какие-либо изменения с записями базы данных: добавление, редактирование, удаление записей таблиц, а также при открытии соединения с базой данных в начале работы программы.
Добавить в класс новый метод можно либо вручную, либо с использованием визуальных средств разработки. Для этого выбрать в меню View пункт Class View. В результате откроется окно, где можно просматривать список всех классов, описанных в пространстве имен приложения. Щелкнув правой кнопкой на класс главной формы, следует выбрать в контекстном меню пункт View Class Diagram. После этого в рабочей области откроется файл диаграммы классов, где можно создавать новые классы, интерфейсы, делегаты, перечисления и т.п., а также добавлять в существующие классы методы, поля, свойства, события и т.д.
Чтобы добавить в класс метод, нужно щелкнуть правой кнопкой в заголовке класса формы и выбрать в контекстном меню пункт Add->Method. После этого в окне Properties можно будет установить свойства для добавляемого метода: его имя, вид доступа, тип возврата и т.д.
Для обновления содержимого формы следует добавить в класс формы метод UpdateContacts(). Тип возврата метода – void, вид доступа – private, параметров нет. Программный код метода следующий:
private void UpdateContacts()
{
//обновить содержимое таблиц базы данных
phonesTableAdapter.Update(dataSet11);
oleDbDataAdapter1.Update(dataSet11);
//очистить DataSet
dataSet11.Clear();
//заполнить таблицы в объекте DataSet
oleDbDataAdapter1.Fill(dataSet11.Contacts);
phonesTableAdapter.Fill(dataSet11.Phones);
//очистить содерижмое списка фамилий
FamComboBox.Items.Clear();
//заполнить список фамилий значениями из таблицы
foreach (DataRow row in dataSet11.Contacts.Rows)
FamComboBox.Items.Add(row["Fam"]);
//в списке фамилий - ни одна фамилия не выделена
FamComboBox.Text = "";
}
Прежде всего, необходимо сохранить сделанные в программе изменения непосредственно в базу данных. Делается это с помощью метода Update(), применяемого к адаптерам таблиц. Далее содержимое объекта DataSet очищается (Clear()) и заполняется заново методом Fill().
Выпадающий список FamComboBox содержит список фамилий людей. При изменении содержимого базы данных его также нужно обновить. Сначала его строки методом Clear() очищаются, а затем заполняются заново фамилиями из обновленной таблицы (метод Add()). Цикл foreach используется для просмотра всех записей таблицы.
Так как обновление данных должно выполняться и при запуске программы, то содержимое обработчика события FormLoad изменится следующим образом:
private void Form1_Load(object sender, EventArgs e)
{
oleDbConnection1.Open(); //открыть соединение
UpdateContacts(); //обновить главное окно
}