Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

sql server+c++

.pdf
Скачиваний:
18
Добавлен:
07.06.2015
Размер:
2.12 Mб
Скачать

А1. У вікні Data Sources встановимо залежні стовпці NHostel, Name_Group та NameSchool таблиці Students у режим графічної компоненти ComboBox (п.29). Для таблиці Students встановимо режим Details та перетягнемо її на форму (рис. 4.23).

30

29

Рис. 4.23. Розміщення деталізованої таблиці з елементами ComboBox

31

Рис. 4.24. Реалізація зв’язку «один до багатьох» для забезпечення цілісності значень

49

Далі (рис. 4.24), перетягуємо лівою клавішею миші таблицю Hostels (п. 31) на відповідний графічний компонент ComboBox з міткою NHostel на формі. У результаті цих дій майстер додасть у розділі Components Tray компоненти HostelsBindingSource та

HostelsTableAdapter. Аналогічно перетягуємо і таблиці Groups та Schools на відповідні їм графічні компоненти ComboBox на формі.

Після цього можемо запустити клієнтську програму на виконання .

Рис. 4.25. Програма-клієнт з елементами ComboBox

Урезультаті, клієнтська програма має приблизно виглядати як на рис. 4.25. Для введення значень у залежні стовпці таблиці Students достатньо мишею натиснути галочку на графічній компоненті ComboBox та вибрати зі списку необхідне значення.

А2. Подібному налаштуванню з вибором значень зі списку піддається і компонента DataGridView. Для цього необхідно з вікна Data Sources перетягнути таблицю Students на форму, як на рис. 4.16 (таблиця повинна знаходитися в режимі DataGridView). Потім натиснути правою клавішею миші на компоненті DataGridView, що знаходиться на формі, та у контекстному меню вибрати пункт Edit Columns.

Удіалоговому вікні Edit Columns (рис. 4.26) для стовпців, що мають мати випадаючі списки, необхідно встановити параметр

ColumnType у значення DataGridViewComboBoxColumn.(п. 32).

Далі у групі параметрів Data (рис. 4.27) потрібно вибрати джерело даних для параметра DataSource. Якщо для таблиці, з якою необхідно зв’язатися, ще немає у розділі Components Tray форми відповідної компоненти BindingSource, тоді слід розкрити гілки дерев

Other Data Sources, Project Data Sources та в строго типізованому

50

об’єкті DataSet нашого проекту вибрати необхідну для зв’язування таблицю (п. 33). Для двох інших параметрів ValueMember та DisplayMember необхідно вибрати з таблиці, з якою зв’язуємося, такі стовпці: перший, що виступає у ролі ключа для зв’язування (п. 34), другий – що призначений для відображення (п. 35).

32

Рис. 4.26. Вікно Edit Columns

33

а)

35

34

б)

в)

 

Рис. 4.27. Встановлення параметрів для зовнішнього зв’язку

51

Після запуску на виконання клієнтська програма має виглядати як на рис. 4.28.

Рис. 4.28. Програма-клієнт з DataGridView із випадаючими списками

Б. Реалізація реляційної схеми «головний-підлеглий». Для такого варіанту, як головну виберемо таблицю Groups, як підлеглу – Students. У вікні Data Sources розкриємо таблицю Groups.

36

37

Рис. 4.29. Вікно Data Sources

Як видно з рис. 4.29, таблиця Students представлена у двох ролях:

1)як підлеглий об’єкт таблиці Groups (п. 36).

2)як братерський об’єкт по відношенню до таблиці Groups (п. 37).

На братерському рівні таблиці реляційно не прив’язані, існує лише обмеження зовнішнього ключа. Для реалізації реляційної залежності одна з таблиць має бути підлеглою по відношенню до іншої.

Для реалізації цієї схеми перетягнемо головну таблицю Groups на форму програми. Далі перетягнемо залежну таблицю Students також на форму програми. Після цього дизайн форми повинен виглядати як на рис. 4.30.

52

Рис. 4.30. Вигляд форми програми з двома залежними таблицями

Узалежності від того, в якому порядку ми перетягуємо з вікна Data Sources таблиці на форму, то відповідно так і вносяться майстром стрічки коду для заповнення даними цих таблиць з бази даних. Якщо для таблиць зі зовнішнім зв’язком порядок невірний, тоді при запуску програми генеруються помилка виконання (4.31).

Унашому випадку ми перетягували спершу таблицю Groups, а потім залежну від неї таблицю Students. При цьому майстер створив функцію для оброблення події завантаження форми і вніс стрічки коду для заповнення даними з бази даних у такому вигляді:

private: System::Void Form1_Load

(System::Object^ sender, System::EventArgs^ e)

{

this->StudentsTableAdapter->Fill(this->KSADataSet->Students); this->GroupsTableAdapter->Fill(this->KSADataSet->Groups);

}

Рис. 4.31. Помилка часу виконання

53

Вищенаведений програмний код має певну нелогічність, що й викликає помилку часу виконання. У першу чергу, програма заповнює даними підлеглу таблицю Students, яка має посилання на головну Groups. А оскільки остання ще не завантажена в об’єкт DataSet, то відповідно, не може встановити зовнішню залежність, і це генерує помилку. Тому необхідно внести певну корекцію у цю функцію оброблення події – поміняти місцями стрічки коду, що завантажують таблиці в об’єкт DataSet.

private: System::Void Form1_Load

(System::Object^ sender, System::EventArgs^ e)

{

this->GroupsTableAdapter->Fill(this->KSADataSet->Groups); this->StudentsTableAdapter->Fill(this->KSADataSet->Students);

}

Інший нюанс пов’язаний з передачею обновлень назад в базу даних. Панель навігатора додається майстром на форму лише при перетягуванні першої таблиці на форму. Ця панель навігатора одразу має кнопку з дискетою для збереження даних у базі даних та, відповідно, прив’язаний до неї програмний код для передачі обновлень першої таблиці. Для передачі обновлень для другої таблиці можна до функції оброблення події натиснення кнопки з дискетою додати також відповідні стрічки обновлення для залежної таблиці. Після цієї корекції функція має виглядати так:

private: System::Void GroupsBindingNavigatorSaveItem_Click (System::Object^ sender, System::EventArgs^ e)

{

this->Validate(); this->GroupsBindingSource->EndEdit();

this->GroupsTableAdapter->Update(this->KSADataSet->Groups);

this->StudentsBindingSource->EndEdit(); this->StudentsTableAdapter->Update(this->KSADataSet->Students);

}

У кінцевому результаті програма-клієнт має виглядати як на рис. 4.32. При занесенні нових стрічок у таблицю Students, для її стовпців ID та Name_Group значення підставляються автоматично. При цьому, значення-мітки автоінкременту генеруються від’ємними, згідно попередньо встановленої нами логіки для цього стовпця.

54

Рис. 4.32. Програма-клієнт зі зв’язком «головний-підлеглий»

4.3.5. Відображення на формі зв’язку «багато до багатьох».

Такий зв’язок, що у базі даних реалізується за допомогою стикувальної таблиці та двох зв’язків «один до багатьох», на формі програми відображається у вигляді двох таблиць: однією з учасників зв’язку та додаткової стикувальної таблиці. Між головною та стикувальною таблицею встановлюється зв’язок за реляційною схемою «головнийпідлеглий» (розділ 4.3.4.Б, стр. 52). Між стикувальною таблицею та другим учасником зв’язку «багато до багатьох» налаштовується зв’я- зок у вигляді підтримки цілісності значень (розділ 4.3.4.А2, стр. 50).

Перетягнемо з вікна Data Sources на форму таблицю Students, підлеглу таблицю Joint та її стовпець Date_receiving (рис. 4.33).

Рис. 4.33. Реалізація зв’язку «багато до багатьох»

55

Таблицю Students можемо розмістити на формі у вигляді сітки або ж у деталізованому вигляді. Для стикувальної таблиці Joint для полегшення введення значення дати додатково розмістимо на формі стовпець Date_receiving у вигляді компоненти DateTimePicker (рис. 4.33).

Таблиця Joint повинна відображати зв’язані дані з таблиці Debts для поточної стрічки таблиці Students. З таблиці Debts необхідно відображати значення двох стовпців Subject та Teacher. Тому перед підстановкою їх у таблицю Joint попередньо необхідно їх об’єднати за допомогою формули.

А. Зовнішнє об’єднання стовпців. Перейдемо у графічний ре-

жим XSD-схеми, виберемо мишею метод Fill,GetData() таблиці Debts (рис. 4.34, п. 38) та у вікні Properties відкорегуємо SQL-запит з бази даних, натиснувши кнопку параметра CommandText (п. 39).

38

39

Рис. 4.34. Додавання нового обчислювального стовпця до таблиці

40

41

Рис. 4.35. Редактор Query Builder для побудови SQL-запитів

56

Увікні редактора SQL-запитів Query Builder (рис. 4.35) додамо

уконструкцію SELECT такий обчислювальний стовпець (п. 40)

RTRIM(Subject) + ' ' + RTRIM(Teacher) AS SubjTeacher

який є результатом конкатенації двох стовпців з усіченими пробілами на кінці. Після закриття вікна редактора система видасть повідомлення з пропозицією перебудувати команду передачі обновлення у базу даних. Цю пропозиції слід відхилити та залишити команду обновлення без змін (рис. 4.36, п. 42).

42

Рис. 4.36. Запит на перебудову команди обновлення даних

Після корегування XSD-схему необхідно зберегти . Після цього переходимо знову у режим дизайну форми програми.

Далі налаштовуємо таблицю Joint у вигляді підтримки цілісності значень, тобто відображення значень таблиці Debts у вигляді стовпців з випадаючими списками. Для цього натискаємо праву кнопку миші на компоненті DataGridView таблиці Joint та у контекстному меню вибираємо пункт Edit Columns.

Стовпець ID_Student стикувальної таблиці використовується лише для забезпечення зв’язку з головною таблицею, і тому може бути вилучений з перегляду (рис. 4.37).

43

44

Рис. 4.37. Вилучення стовпця з компоненти DataGridView

57

50

45

47 49

48

46

51

Рис. 4.38. Налаштування стовпця на відображення значення за зовнішнім ключем

Тепер необхідно налаштувати стовпець ID_Subject (п. 45) на відображення значення за зовнішнім ключем з таблиці Debts (рис. 4.38):

46.Для параметра ColumnType виберіть зі списку значення

DataGridViewComboBoxColumn;

47.Виберіть джерело даних для параметра DataSource. Оскільки дані з таблиці Debts ще не були відображені на формі, то для цього необхідно розкрити гілки дерев Other Data Sources, Project Data Sources та в об’єкті DataSet вибрати таблицю Debts.

48.Для параметра ValueMember виберіть стовпець таблиці Debts, що виступає у ролі ключа для зв’язування.

49.Для параметра DisplayMember виберіть стовпець таблиці Debts, значення якого має відображатися.

50.У параметрі HeaderText перейменуйте надпис для стовпця ID_Subject, що відображається на компоненті DataGridView.

51.Підтвердіть вибрані параметри кнопкою ОК.

Тепер, аналогічно до розділу 4.3.4.А2 (стр. 50), налаштуємо

також компоненту DataGridView для таблиці Students. Стовпці цієї таблиці NHostel, Name_Group та NameSchool мають давати можли-

вість вибирати значення зі списку, тобто мати реляційну залежність, відповідно, з таблицями Hostels, Groups та Schools.

Для уникнення помилки часу виконання, що пов’язана з обмеженнями зовнішнього ключа, таблиці повинні завантажуватися в об’єкт DataSet у строго визначеній послідовності. У нашому випадку, таблиці Students та Joint повинні завантажуватися останніми.

58

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]