Практична робота 9

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

Практична робота № 9

Тема: "Обробка даних щодо багато до багатьох"


Мета роботи: отримати практичні навички з налаштування підключення до
БД та обробки таблиць, пов'язаних ставленням багато до багатьох

Хід роботи

Нехай є БД catalog для зберігання даних про книги, читачів та облік видачі
та повернення книг. БД має три таблиці, пов'язані ставленням багато до
багатьох.
Потрібно підключити БД до проекту. При цьому шлях до бази даних
повинен зберігатися в INI файлі.

Вказівки: Виконайте команду Дані - Створити нове підключення. Запуститься


майстер створення підключення до БД. У вікні виберіть "База даних", а потім "Набір
даних". На наступному кроці клацніть кнопку "Створити підключення". У новому вікні
Вам буде запропоновано підключити файли бази даних SQL Server. Клацніть на кнопці
"Змінити" та виберіть формат БД "Microsoft Access". Після цього вкажіть потрібний файл
БД (шлях до файлу не видаляйте, середовище C# самостійно скопіює вказаний файл у
папку проекту та скоригує шлях до нього). Щоб перевірити з'єднання, клацніть на кнопці
"Перевірити підключення".
Після встановлення параметрів БД під час переходу на наступний крок майстра
з'явиться запит на копіювання файлу БД до папки з проектом, підтвердіть цю операцію.
На наступному кроці виберіть потрібні таблиці, з якими плануєте працювати у
проекті. На наступному кроці вкажіть ім'я з'єднання, а на останньому кроці клацніть
"Готово".
Щоб переглянути з'єднання, виконайте команду "Дані - Показати джерело
даних". Відкриється вікно, в якому з'явиться ім'я вашого з'єднання та список таблиць,
доступних у проекті.
Після налаштування підключення у списку файлів проекту з'явиться файл
налаштувань з ім'ям app.config Відкрийте файл, у якому можна побачити
ім'я параметра з'єднання (у нашому випадку catalogConnectionString )
та його значення ( "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=| DataDirectory|\catalog.mdb" ). У цьому значенні видно,
що ім'я БД явно. Необхідно в коді реалізувати можливість зміни імені БД та
збереження нового шляху до INI файлу.
Для роботи з файлами INI будемо використовувати зовнішній
клас INIFile.css Викличте контекстне меню проекту, виберіть команду Додати -
Існуючий елемент і вкажіть файл класу.
Для вибору файлу БД використовуватимемо діалог. нанесіть на форму
компонент openFileDialog і задайте властивості: FileName -
очистити, Filter = Файли БД|*.mdb
Також для перевірки наявності файлу БД по вказаному шляху
використовуватимемо клас File , для роботи з яким потрібно підключити
простір імен:

за допомогою System.IO;

У події Load форми введіть код:

private void Form1_Load(відправник об’єкта, EventArgs


e)
{
//Створюємо об'єкт для роботи з INI файлом
//файл знаходиться у папці з проектом під
ім'ям settings.ini
INIFile ini = новий
INIFile(Application.StartupPath + "\\settings.ini");

// описуємо змінну для зберігання шляху до БД


//і зчитуємо в нього значення з файлу INI
string path=ini.IniReadValue("Baza", "path", "");

//якщо лічений у змінну шлях немає


if ( ! File.Exists ( шлях ))
// відкриваємо діалог вибору БД
//якщо файл БД обраний
if (openFileDialog1.ShowDialog() ==
DialogResult.OK)
{
//записуємо новий шлях у змінну
path = openFileDialog1.FileName;
//зберігаємо змінну в INI файл
ini.IniWriteValue("Baza","шлях",шлях);
}
//якщо користувач відмовився від вибору БД
інше
//завершуємо роботу програми
Application.ExitThread();

// Налаштовуємо параметри підключення


//параметру "catalogConnectionString" присвоюємо
рядок підключення
//замість імені БД підставляємо змінну path
Properties.Settings.Default["catalogConnectionStri
ng"] = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" +path ;
// Зберігаємо значення параметра
Properties.Settings.Default.Save();

//Відображаємо головну форму поверх решти вікон


TopMost = правда;
TopMost = false;
}

Відобразіть на формі дані з таблиць, як показано на малюнку.

Для відображення таблиці books нанесіть на форму


компонент bindingSource і задайте властивості: DataSource
= catalog DataSet, DataMember = books . Нанесіть на форму верхню
сітку dataGridView та задайте властивість DataSource =
bindingSource1. Для сітки у якості Columns задайте параметри
колонок.
Для відображення таблиці readers нанесіть на форму
компонент bindingSource і вкажіть властивості: DataSource
= catalog DataSet, DataMember = readers . Нанесіть на форму
нижню ліву сітку dataGridView і вкажіть властивість DataSource =
bindingSource2, DataMember = readers . Для сітки у
якості Columns задайте параметри колонок.
Для відображення обліку видачі книг потрібно внести зміни до запиту
таблиці uchet . На малюнку видно, що у сітці відображаються поля fam,
imya, otc h з таблиці readers і поля data_out та data_in з
таблиці uchet . Перейдіть у вікно "Джерела даних" та клацніть на кнопці
"Змінити набір даних у конструкторі". У контекстному меню
таблиці uchet виберіть команду "Налаштувати" і у вікні, введіть текст запиту:

SELECT uchet.id_uchet, uchet.id_book, uchet.id_reader,


readers.fam, readers.imya, readers.otch, uchet.data_in,
uchet.data_out
З учет INNER JOIN читачів
НА uchet.id_reader = readers.id_reader

Для відображення таблиці uchet та зв'язування її з таблицею books


(bindingSource1) нанесіть на форму компонент bindingSource і задайте
властивості: DataSource = bindingSource1 , DataMember = ім'я
зв'язку між таблицями . Нанесіть на форму праву нижню
сітку dataGridView і вкажіть властивість DataSource =
bindingSource3. Для сітки у якості Columns задайте параметри
колонок.
Відкрийте подію Load форми та знайдіть код відкриття 3-х таблиць виду:

//завантажуємо дані з таблиці books


this.booksTableAdapter.Fill(this.catalogDataSet.books)
;
//завантажуємо дані з таблиці readers
this.readersTableAdapter.Fill(this.catalogDataSet.read
ers);
// завантажуємо дані з таблиці uchet
this.uchetTableAdapter.Fill(this.catalogDataSet.uchet)
;

Перенесіть ці команди до кінця коду події. Якщо якоїсь із цих команд


немає, то додайте її.

У верхній сітці відзначатиме кольором видані книги. У таблиці є


поле label . Якщо label = 1 (книга видана) то рядок зафарбовується
кольором. Якщо label = 0 ( книга повернута), колір повертається у
вихідний.

Вказівки: у сітці dataGridView1 у події RowPrePaint введіть код:

private void dataGridView1_RowPrePaint(відправник


об’єкта, DataGridViewRowPrePaintEventArgs e)
{
//описуємо змінну для збереження вихідного кольору
Колір c = новий колір();
//зберігаємо вихідний колір сітки
c = dataGridView1.DefaultCellStyle.BackColor;
//якщо 7-я колонка (відповідає полю " label ")
дорівнює 0 (книга повернута)
if
(dataGridView1.Rows[e.RowIndex].Cells[6].Value.ToString()
== "0")
//поточний рядок зафарбовуємо
вихідним кольором
dataGridView1.Rows[e.RowIndex].DefaultCellStyl
e.BackColor = c;
//якщо 7-я колонка (відповідає полю " label ") не
дорівнює 0 (книга видана)
інакше, якщо
(dataGridView1.Rows[e.RowIndex].Cells[6].Value.ToString()
=="1")
//поточний рядок зафарбовуємо світло-оранжево-
рожевим кольором
dataGridView1.Rows[e.RowIndex].DefaultCellStyl
e.BackColor = Color.LightSalmon;
}

Додайте на форму два текстові поля. Перше поле призначене для введення
та пошуку книги за її шифром. Друге поле призначене для введення та пошуку
читача за його шифром.

Нанесіть на форму компонент TextBox і в події TextChanged введіть


код:

private void textBox1_TextChanged(відправник об’єкта,


EventArgs e)
{
// встановити позицію у першій таблиці на запис
//яка шукається за значенням текстового поля у
полі таблиці shifr
bindingSource1.Position=bindingSource1.Find("shifr
",textBox1.Text);
}

Нанесіть на форму компонент TextBox і в події TextChanged введіть


код:

private void textBox2_TextChanged(відправник об’єкта,


EventArgs e)
{
// встановити позицію у другій таблиці на запис
//яка шукається за значенням текстового поля у
полі таблиці shifr
bindingSource2.Position=bindingSource1.Find("shifr
",textBox2.Text);
}

Реалізуйте функцію обліку видачі книги. При цьому, якщо для


книги label = 1 ( книга видана), то операція не виконується.

Вказівки: таблиця u chet побудована на основі запиту на дві таблиці. Це


унеможливлює стандартне додавання записів ( метод
bindingSource3.AddNew) не працює.
Для вирішення проблеми додавання будемо виконувати за допомогою
запиту INSERT .
Перейдіть у вікно "Джерела даних" та клацніть на кнопці "Змінити набір
даних у конструкторі". У контекстному меню таблиці uchet виберіть команду
"Додати - Запит", у вікні виберіть тип запиту INSERT і в наступному вікні
введіть текст запиту:

INSERT INTO uchet


(id_book, id_reader, data_out)
ЗНАЧЕННЯ (?, ?, ?)

На наступному кроці вкажіть ім'я Vydach a як ім'я методу. В результаті


буде створено новий метод із параметрами Vydacha(id_book,
id_reader, data_out).
Нанесіть на форму першу кнопку та для кнопки введіть код:

private void button1_Click(відправник об’єкта,


EventArgs e)
{
//якщо у першій таблиці поле label = 1 ( книга
видана)
if ((bindingSource1.Current as
DataRowView)["label"] .ToString() == " 1 " )
{
//видаємо повідомлення про помилку
MessageBox.Show("Вказана книга вже видана",
"Операція не виконана",
MessageBoxButtons.OK,
MessageBoxIcon.Error) ;
//завершуємо роботу підпрограми
повернення;
}
//для запису даних про видачу книги в
таблицю uchet
// Викликаємо метод Vydacha і передаємо в нього
параметри
// id_book з першої таблиці ,
// id_reader з другої таблиці та поточну дату
uchetTableAdapter.Vydacha(
Convert.ToInt32((bindingSource1.Current as
DataRowView)["id_book"]),
Convert.ToInt32((bindingSource2.Current as
DataRowView)["id_reader"]),
Convert.ToDateTime(DateTime.Today));
//оновлюємо дані для третьої таблиці
uchetTableAdapter.Fill(catalogDataSet.uchet);

//У першій таблиці після видачі книги ставимо в


полі label значення 1
(bindingSource1.Current as DataRowView)["label"] =
1;
//зберігаємо дані у першій таблиці
bindingSource1.EndEdit();
booksTableAdapter.Update(catalogDataSet.books);
}

Реалізуйте функцію повернення книги. Користувач у третій сітці вибирає


запис про видану книгу та реєструє факт повернення. При цьому в
таблиці uche t в полі data_in вводиться поточна дата, а в полі label першої
таблиці ставимо значення 0 (повернена книга). Також потрібно передбачити, що
якщо поле data_in у таблиці uchet заповнено, то повернути книгу не можна,
оскільки вона вже повернута.

Вказівки: оскільки таблиця uchet створена за двома таблицями, то


змінити її можна лише за допомогою запиту UPDATE .
Перейдіть у вікно "Джерела даних" та клацніть на кнопці "Змінити набір
даних у конструкторі". У контекстному меню таблиці uchet виберіть команду
"Додати - Запит", у вікні виберіть тип запиту UPDATE і в наступному вікні
введіть текст запиту:

UPDATE uchet
SET data_in = ?
WHERE (id_uchet =?)

На наступному кроці як ім'я методу вкажіть ім'я S dach a. В результаті


буде створено новий метод з параметрами S dacha
( data_in , id_uchet ).
Нанесіть на форму другу кнопку та для кнопки введіть код:
private void button2_Click(відправник об’єкта,
EventArgs e)
{
//якщо поле data_in не порожнє (книга вже
повернуто)
if ((bindingSource3.Current as
DataRowView)["data_in"].ToString() != "")
{
//видаємо повідомлення про помилку
MessageBox.Show("Вказаний читач вже повернув
книгу",
"Операція не виконана",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
//завершуємо роботу підпрограми
повернення;
}

//Для запису даних про повернення книги


//викликаємо метод Sdacaha і передаємо в нього
параметри
//поточна дата та id_uchet з третьої таблиці
uchetTableAdapter.Sdacha(
Convert.ToDateTime(DateTime.Today),
Convert.ToInt32((bindingSource3.Current as
DataRowView)["id_uchet"]));
//оновлюємо дані для третьої таблиці
uchetTableAdapter.Fill(catalogDataSet.uchet);

//У першій таблиці після видачі книги ставимо в


полі label значення 0
(bindingSource1.Current as DataRowView)["label"] =
0;
//зберігаємо дані у першій таблиці
bindingSource1.EndEdit();
booksTableAdapter.Update(catalogDataSet.books);
}

Реалізуйте функцію видалення третьої таблиці запису про видану


книгу. При цьому, якщо поле data_in порожнє (книга не повернена), видалити
запис неможливо.

Вказівки: так як таблиця uchet створена за двома таблицями, видалити


дані з неї можна тільки за допомогою запиту DELETE .
Перейдіть у вікно "Джерела даних" та клацніть на кнопці "Змінити набір
даних у конструкторі". У контекстному меню таблиці uchet виберіть команду
"Додати - Запит", у вікні виберіть тип запиту DELETE і в наступному вікні
введіть текст запиту:

DELETE from uchet


where id_uchet=?

На наступному кроці як ім'я методу вкажіть ім'я DelUchet . В результаті


буде створено новий метод з параметрами DelUchet ( id_uchet ).
Нанесіть на форму третю кнопку та для кнопки введіть код:

private void button3_Click(відправник об’єкта,


EventArgs e)
{
//якщо у третій таблиці немає даних
//Підпрограма завершує роботу
if (bindingSource3.Count == 0) return;

//якщо поле data_in порожнє (книга не повернуто)


if ((bindingSource3.Current as
DataRowView)["data_in"].ToString()=="")
{
//видаємо повідомлення про помилку
MessageBox.Show("Вказана книга не повернута",
"Скасування видалення",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
//Підпрограма завершує роботу
повернення;
}
//видаємо запит на видалення запису
if (MessageBox.Show("Видалити запис про видачу
книги?",
"Підтвердіть",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button
2)==DialogResult.Yes)
{
//викликаємо метод DelUchet і передаємо в
нього параметр
//поле id_uchet із третьої таблиці
uchetTableAdapter.DelUchet(Convert.ToInt32((bi
ndingSource3.Current as DataRowView)["id_uchet"]));
uchetTableAdapter.Fill(catalogDataSet.uchet);
}
}

You might also like