You are on page 1of 10

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

Тема: «Робота з базами даних у C #»


Мета роботи: отримати практичні навички щодо створення програм для
роботи з БД

Хід роботи

Нехай у СУБД Access спроектована база даних ( завантажити ). База


захищена паролем " rpo " і має дві таблиці.

Таблиця " students ", складається з полів:

Ім'я поля Тип Розмір


id Лічильник ключове
fam Текстовий 15
imya Текстовий 15
otch Текстовий 15
grup Текстовий 15
finance Текстовий 10 (Держзамовлення, контракт)
datar Дата час
Одинарної точності з
srbal Числовій плаваючою точкою. Значення
за промовчанням - 0
foto Поле OLE

Таблиця " groups ", складається з полів:

Ім'я поля Тип Розмір


grupa текстове ключове

У програмі на C # виконайте підключення бази даних

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


Запуститься майстер створення підключення до БД. У вікні виберіть "База
даних", а потім "Набір даних". На наступному кроці клацніть кнопку "Створити
підключення". У новому вікні Вам буде запропоновано підключити файли БД
SQL Server . Клацніть на кнопці "Змінити" і виберіть формат БД " Microsoft "
Access ". Після цього вкажіть потрібний файл БД (шлях до файлу не видаляйте
середовище C # самостійно скопіює вказаний файл у папку проекту та скоригує
шлях до нього). Оскільки база захищена паролем, то клацніть на кнопці
"Додатково" та в рядку " Jet OLEDB : DataBase Password " вкажіть пароль " rpo
". Щоб перевірити з'єднання, клацніть на кнопці "Перевірити
підключення". Після завдання всіх параметрів майстер запропонує вибрати
спосіб збереження пароля до БД: увімкнувши рядок підключення або
включивши код програми. Виберіть варіант увімкнення у рядок підключення.
Після встановлення параметрів БД під час переходу на наступний крок
майстра з'явиться запит на копіювання файлу БД до папки з проектом,
підтвердіть цю операцію.
На наступному кроці виберіть потрібні таблиці, з якими плануєте
працювати у проекті. На наступному кроці вкажіть назву з'єднання, а на
останньому кроці клацніть "Готово".
Щоб переглянути з'єднання, виконайте команду Дані - Показати джерело
даних. Відкриється вікно, в якому з'явиться ім'я вашого з'єднання та список
таблиць, доступних у проекті.
Відразу потрібно налаштувати поведінку поля-лічильника у таблиці
students . У вікні "Джерела даних" клацніть на кнопці "Змінити набір даних у
конструкторі". виділіть поле id та змініть властивості: AutoIncrementSeed = 1,
AutoIncrementStep = 1.

Створіть програму для роботи з таблицею. При цьому форма повинна мати
вигляд:

Сітка заблокована для введення.

Вказівки: нанесіть на форму BindingSource і задайте йому властивості:


DataSource = наше створене з'єднання ( BazaDataSet ), DataMember = ім'я
таблиці students , Sort = fam (дані будуть відсортовані на прізвище). Зауважте,
що на формі з'явилися додаткові компоненти для роботи з таблицею:
bazaDataSet - Для доступу до підключення, студентистабільногоAdapter - до
роботи з таблицею БД.
Для відображення даних на формі нанесіть на форму компонент D
ataGridView та задайте властивості: DataSource = наш bindingSource 1,
AutoSizeColumnsMode = Fill ( ширина колонок підлаштовується під розмір
сітки), AllowUserToAddRows = false (заборона додавання нових рядків у сітці),
ReadOnly = true .

Додайте до сітки поле Стипендія, яке обчислюється за такою формулою:

якщо фінансування дорівнює "Держзамовлення" та


середній бал від 10..12 = 600;
якщо фінансування дорівнює "Держзамовлення" та
середній бал 7..9 = 550
в решті випадків 0.

Вказівки: для розрахунку користуватимемося функцією виду:

iif(умова, значення при виконанні умови, значення при


невиконанні умови)

Відкрийте вікно "Джерела даних" і на панелі інструментів клацніть на


кнопці "Змінити набір даних у конструкторі".
В результаті ви побачите структури таблиць, що входять до з'єднання. У
контекстному меню таблиці " students " виберіть команду "Додати - Стовпець".
Введіть ім'я поля " stip " і у якості Expression введіть формулу для розрахунку:

iif(finance=' Госзамовлення ', iif


(srbal>=10,600,iif(srbal>=7,550,0)),0)

Перейдіть на форму із сіткою. Ви побачите, що додавання нових колонок


не призводить до оновлення даних. У сітці нове поле не з'явилося. Щоб
вирішити цю проблему, оновіть компонент bindingSource1. Для цього в
властивості DataMember вкажіть значення "Відсутня", а потім знову виберіть
таблицю "students".

У сітці відображаються поля (прізвище, ім'я, по батькові, фінансування,


середній бал). Усі поля у сітці назвати російською.

Вказівки: для налаштування параметрів сітки відкрийте її властивості


Columns . Ви побачите список усіх її колонок. Для кожної колонки у властивості
HeaderText вкажіть назву, у властивості Visible можна приховати непотрібні
колонки. Для роботи нашого коду далі обов'язково назвіть поле із середнім
балом - "Ср.балл"

На формі розмістіть дві кнопки для додавання та видалення даних.


При цьому за допомогою кнопки "Додати" можна запровадити нового
студента за допомогою допоміжної сторінки форми. Кнопка "Видалити"
видаляє поточний запис.
Подвійне клацання за рядком у сітці відкриває сторінкову форму для
редагування даних.

Вказівки: додайте до проекту нову форму Form2 . Вимкнемо на формі


кнопку закриття вікна. Для цього задайте властивість ControlBox = false .
Оскільки форма Form2 створюється динамічно, то її закритті потрібно
видаляти форму з пам'яті. Для цього в події Closed введіть команду :

void Form2_FormClosed(object sender,


FormClosedEventArgs e)
{
Dispose();
}

При додаванні нового запису курсор переміщатиметься на останній запис.


Якщо користувач відмовиться від збереження, повернення назад не відбудеться.
Тому потрібно про всяк випадок запам'ятовувати поточне положення у сітці.
Для цього зверху форми опишіть глобальну змінну, доступну для інших форм:

public int pos;

Для кнопки "Додати" на головній формі напишіть код виду:

void Button1_Click(object sender, EventArgs e)


{
//Запам'ятовуємо поточне положення в таблиці
pos = binding Source 1.Position;
//додаємо новий запис
binding Source 1.AddNew();
//Створюємо екземпляр сторінкової форми
Form2 form2 = новий Form2();
//відкриваємо форму в модальному режимі
form2.ShowDialog();
}

Для кнопки Видалити напишемо код:

void Button2_Click(object sender, EventArgs e)


{
//видаємо повідомлення на підтвердження операції
if (MessageBox.Show("Видалити рядок?",
"Підтвердіть операцію",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2)==DialogResult.Yes)
{
//якщо користувач підтвердив операцію
// видаляємо поточну рядок
bindingSource1.RemoveCurrent();
// зберігаємо зміни в БД
studentsTableAdapter.Update(bazaDataSet.students);
}
}

Подвійним клацанням на сітці користувач відкриває сторінкову форму для


редагування поточного запису. Для цього в події MouseDoubleClick сітки
напишемо код :

private void dataGridView1_MouseDoubleClick(object


sender, MouseEventArgs e)
{
//Запам'ятовуємо поточне положення в таблиці
pos = binding Source 1.Position;
//Створюємо екземпляр сторінкової форми
Form2 form2 = новий Form2();
//відкриваємо форму в модальному режимі
form2.ShowDialog();
}

Допоміжна сторінкова форма має вигляд:

Фото співробітника заповнюється за допомогою діалогу вибору графічного


файлу при натисканні на кнопці "+". Кнопка "-" очищає поле Фото.
Поле Група заповнюється за допомогою списку, що формується на основі
другої таблиці-довідника " groups ".
Поле Фінансування заповнюється за допомогою списку з двох значень
(Держзамовлення, Контракт).
Поле Дата народження заповнюється календарем.
Кнопка Зберегти закриває вікно та зберігає запис.
Кнопка Скасувати закриває вікно та скасовує внесені зміни.

Вказівки: розмістіть на другій формі 4 текстових полів


TextBox (прізвище, ім'я, по-батькові, середній бал), 2 випадаючих списку
ComboBox (група та фінансування), календар DateTimePicker (дата
народження). Для фото додайте компонент PictureBox (задайте властивість
SizeMode = Zoom ) та дві кнопки для додавання та очищення фото.

Фото заповнюватимемо за допомогою діалогу. Нанесіть на форму


компонент OpenFileDialog та у властивості Filter вкажіть допустимі
формати графічних файлів:

Графічні файли|*.jpg;*.gif;*.bmp;*.png

Для кнопки "+" напишіть код додавання фотографії:

void Button1_Click(object sender, EventArgs e)


{
// якщо файл в діалозі обраний
if (openFileDialog1.ShowDialog()==DialogResult.OK)
{
// записуємо файл в змінну
Bitmap pict = новий Bitmap(openFileDialog1.FileName);
// в поле pictureBox відображаємо змінну
pictureBox1.Image = (Image)pict;
}
}

Для кнопки "-" напишемо код очищення фотографії:

void Button2_Click(object sender, EventArgs e)


{
pictureBox1.Image=null;
}

Список Група повинен заповнюватися значеннями з таблиці " groups " БД.
Для звернення до таблиці нанесіть на форму компонент BindingSource і
задайте йому властивості: DataSource = наше підключення ( BazaDataSet ),
DataMember = необхідна таблиця ( groups ).
Для списку Група вкажіть властивості: DataSource = bindingSource 1,
ValueMember = поле з таблиці groups ( grupa ).
Список фінансування має два значення: Держзамовлення, Контракт.
Введіть їх за допомогою параметрів Items списку.

Для поля Середній бал задамо обмеження від 4 до 12. При цьому поле не
може бути порожнім і можна вводити в поле тільки числа.
Для поля textBox 4 у події OnValidating введемо код:

private void textBox1_Validating(object sender,


CancelEventArgs e)
{
//Змінна для виклику методу TryParse
double rez;

//якщо поле порожнє


if (textBox1.Text.Trim() == "")
{
//видаємо повідомлення про помилку
MessageBox.Show("Бал не може бути порожнім",
Помилка _ введення ",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
//завершуємо роботу підпрограми
return;
}

//якщо вміст поля не вдалося конвертувати в double


//значить у полі не число
if (!double.TryParse(textBox1.Text,out rez))
{
//видаємо повідомлення про помилку
MessageBox.Show("Введені дані не є числом",
Помилка _ введення ",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
//завершуємо роботу підпрограми
return;
}

//якщо вміст поля не потрапляє у діапазон від 4 до


12
if (Convert.ToDouble(textBox1.Text) < 4 ||
Convert.ToDouble(textBox1.Text) > 12)
{
//видаємо повідомлення про помилку
MessageBox.Show("Балл повинен бути в діапазоні від 4
до 12",
Помилка _ введення ",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
//забороняємо вихід із поля
e.Cancel = true;
}
}

Всі наступні дії будуть виконуватися за допомогою компонентів,


розміщених на головній формі. За умовчанням головна форма немає імені й у
звернення до неї потрібно головній формі присвоїти ім'я.
Відкрийте файл проекту Program . cs .
Після рядка заголовка класу проекту

static class Program

опишіть глобальну змінну для доступу до головної форми у проекті

public static Form1 form1;

Замініть команду

Application.Run(new Form1());

на команди

Program.form1 = новий Form1();


Application.Run(form1);

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


ім'я Program . form 1

Зв'яжемо всі компоненти на сторінковій формі з полями таблиці через


компонент binding Source 1 на головній формі (його ім'я буде Program
. form 1. bindingSource 1 ). Спочатку зробіть цей компонент бачимо
для інших форм. Для цього задайте властивість Modifiers = Public .

У події Load сторінкової форми додамо код:

void Form2_Load(object sender, EventArgs e)


{
//поле textBox 1. Text прив'язується до поля
fam
textBox1.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "fam", true));
//поле textBox 2. Text прив'язується до поля imya
textBox2.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "imya", true));
//поле textBox 3. Text прив'язується до поля otch
textBox3.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "otch", true));
//список comboBox 1. Text прив'язується до поля
grup
comboBox1.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "grup", true));
//список comboBox 2. Text прив'язується до поля
finance
comboBox2.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "finance", true));
// Календар dateTimePicker1.Value прив'язується до
полю datar
dateTimePicker1.DataBindings.Add(new Binding("Value",
Program.form1.bindingSource1, "datar", true));
//поле textBox 4. Text прив'язується до поля
srbal
textBox4.DataBindings.Add(new Binding("Text",
Program.form1.bindingSource1, "srbal", true));
//компонент pictureBox 1. Image прив'язується до
поля photo
pictureBox1.DataBindings.Add(new Binding("Image",
Program.form1.bindingSource1, "foto", true));
}

Для збереження або скасування ми будемо звертатися до компонентів


studentsTableAdapter та bazaDataSet на основній формі. Тому їх треба
зробити "видимими". Задайте їм властивість Modifiers = True .

Для кнопки Зберегти сторінкової форми напишемо код:

void Button1_Click(object sender, EventArgs e)


{
//перевіряємо всі поля на правильність введення
Program . form 1. Validate ();
//завершуємо редагування поточного запису
Program.form1.bindingSource1.EndEdit();
// оновлюємо дані в БД
//При цьому компоненти доступу до БД знаходяться
на головній формі
Program.form1.studentsTableAdapter.Update(Program.
form1.bazaDataSet.students);
//закриваємо форму
Close();
}

Для кнопки Скасувати напишемо код:


void Button2_Click(object sender, EventArgs e)
{
// скасовуємо редагування поточною записи
Program.form1.bindingSource1.CancelEdit();
//закриваємо форму
Close();
//Повертаємо курсор на попередню позицію в таблиці
Program.form1.bindingSource1.Position=Program.form
1.pos;
}

You might also like