You are on page 1of 92

КОЛЕДЖ КЛАСИЧНОГО ПРИВАТНОГО УНІВЕРСИТЕТУ

ДО ЗАХИСТУ
ДОПУЩЕНО
Голова циклової комісії
технологічних спеціальностей
____________ Ю.В.
Гончаренко
(підпис) (ініціали, прізвище)

(дата)

КВАЛІФІКАЦІЙНОЇ РОБОТА
РОЗРОБКА ДОДАТКУ «ЕЛЕКТРОННА ЧИТАЛЬНА ЗАЛА»

Виконав
ст. групи Некрилов І.К.
(шифр) (підпис) (ініціали, прізвище)

Керівник ст. викл. Бречко Н.А.


(посада) (підпис) (ініціали, прізвище)

Нормоконтроле
р ст. викл. Шумада А.С.
(посада) (підпис) (ініціали, прізвище)
Запоріжжя
20__
КОЛЕДЖ КЛАСИЧНОГО ПРИВАТНОГО УНІВЕРСИТЕТУ
Циклова комісія технологічних спеціальностей

ЗАТВЕРДЖУЮ
Голова циклової комісії з
технологічних спеціальностей
________________ Ю.В.
Гончаренко
(підпис) (ініціали, прізвище)

(дата)

ЗАВДАННЯ
НА ВИКОНАННЯ КВАЛІФІКАЦІЙНОЇ РОБОТИ
студенту групи
КЗІ–216
(шифр)

Некрилову Іллі Костянтиновичу


(прізвище, ім’я та по батькові)

Галузь знань: 12 – Інформаційні технології


Спеціальність: 121 – Інженерія програмного забезпечення
Освітньо–кваліфікаційний рівень – молодший спеціаліст
Форма навчання –заочна
1. Тема кваліфікаційної роботи: Розробка додатку «Електронна
читальна зала»
Затверджена наказом по університету № 03–кзс від «03» грудня 2018р.
2. Термін здачі кваліфікаційної роботи ”29” травня 2019 р.
3. Цільова установка та загальний напрямок кваліфікаційної роботи
(для робіт технічного профілю також "вихідні дані"):
Метою даної кваліфікаційної роботи є створення додатку з базою даних
для обліку книг та їх читання в електронному вигляді.
Об’єкт дослідження: БД бібліотека.
4. Вихідні дані: літературні дані за темою дослідження, побажання
замовника.
5. Зміст кваліфікаційної роботи (перелік питань, які необхідно
розглянути):
5.1. На основі аналізу літературних даних визначити основні
властивості системи управління та її основні характеристики
5.2. Розробити базу даних
5.3. Розробити інтерфейс користувача
5.4. Перевірити працездатність створеної програми
5.5. Сформулювати висновки
5

7. Календарний план виконання роботи:

№ Позначка
Термін
з/п Назви частин роботи про
виконання
виконання
7.1. Складання бібліографії та вивчення
03.12.18 р. Виконано
літературних джерел
7.2. Збирання матеріалу. Написання вступу 04.12.18 р. Виконано
7.3. Виконання розділу 1 01.01.19 р. Виконано
7.4. Виконання розділу 2 11.01.19 р. Виконано
7.5. Виконання розділу 3 01.02.19 р. Виконано
7.6. Виконання розділу 4 05.04.19 р. Виконано
7.7. Виконання розділу 5 07.04.19 р. Виконано
Формулювання висновків. Оформлення Виконано
7.8. 08.04.19 р.
пояснювальної записки кваліфікаційної роботи
7.9. Подання роботи до захисту 29.05.19 р. Виконано

Дата видачі завдання ”03” грудня 2018 р.

Керівник роботи ______________________


(підпис керівника)

Завдання прийняв до виконання _______________________


(підпис студента)

ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ


6

БД – база даних.
СУБД – система управління базами даних.
Таблиця БД – основні таблиці, в яких міститься інформація, що
динамічно змінюється.
Таблиця–перелік – таблиці, в яких зберігається статична інформація, яка
вноситься в БД один раз і може інколи обновлятися. В основному це переліки
типів, видів, таблиць тощо.
SQL – це діалогова мова програмування для здійснення запиту і внесення
змін до БД, а також управління БД.
7

РЕФЕРАТ

Кваліфікаційна робота: 90 сторінок, 27 рисунків, 10 таблиць, 9 джерел, 1


додаток.
Об’єктом дослідження є організація роботи бібліотеки.
Мета роботи — дослідити напрям програм для введення обліку книг та
розробити додаток для зручного обліку та читання книг.
Одержані результати — в даній кваліфікаційній роботі засобами мови
програмування С# у середовищі MS Visual Studio 2017 розроблений
програмний додаток, що призначений для зручного ведення обліку та читання
книг.
Розроблений програмний додаток «Електронна читальна зала» дозволяє:
 вести облік книг;
 вести облік користувачів;
 має доступ до бази в локальній мережі;
 читати книги;
 зберігати книги різних форматів(txt,fb2).
Розроблений програмний продукт має інтуїтивно-зрозумілий графічний
інтерфейс і користувач не потребує спеціальних знань для роботи з ним.
БІБЛІОТЕКА, БД, КНИЖКА, КОРИСТУВАЧ, MYSQL, С#.
8

ЗМІСТ

ЗАВДАННЯ НА ВИКОНАННЯ КВАЛІФІКАЦІЙНОЇ РОБОТИ................2

ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ..............................................................5

РЕФЕРАТ...........................................................................................................6

ВСТУП...............................................................................................................9

1. АНАЛІЗ ФУНКЦІОНАЛЬНИХ ВЛАСТИВОСТЕЙ БІБЛІОТЕКИ...10

1.1 Організація роботи в стандартній бібліотеці.................................10

1.2 Вимоги до програмного продукту..................................................10

1.3 Вимоги до програмного та апаратного забезпечення...................11

1.4 Огляд існуючих рішень...................................................................12

2. ВИБІР ІНСТРУМЕНТАРІЮ ДЛЯ РОЗРОБКИ ДОДАТКУ...............14

2.2 Вибір середовища розробки............................................................14

2.3 Вибір середовища розробки БД......................................................19

3. РОЗРОБКА ПРОГРАМНОГО ПРОДУКТУ.........................................21

3.1 Схема і опис БД................................................................................21

3.2 Опис розробки інтерфейсу програми.............................................30

3.3 Обмеження ведення БД...................................................................48

3.4 Тестування програмного продукту.................................................52

4. РОЗРАХУНОК ЕКОНОМІЧНОГО ЕФЕКТУ ВІД РОЗРОБКИ І


ПРОДАЖУ ПРОГРАМИ..........................................................................................56

4.1. Визначення витрат на розробку програми.........................................56

4.2. Розрахунок вартості програми............................................................58

4.3. Розрахунок економічного ефекту від продажу програми................58

5. ОХОРОНА ПРАЦІ.................................................................................59
9

5.1 Перелік потенційно небезпечних і шкідливих чинників на


виробництві............................................................................................................59

5.2 Технічні рішення та організаційні заходи із гігієни праці,


виробничої санітарії та техніки безпеки.............................................................62

5.3 Безпека в надзвичайних ситуаціях.................................................62

5.4 Заходи з ергономіки.........................................................................65

ВИСНОВКИ.....................................................................................................67

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ.......................................................68

ДОДАТОК........................................................................................................69
10

ВСТУП

Комп’ютерні технології охоплюють усі сфери життя суспільства,


викликаючи в них глибокі якісні зміни. Дедалі ширше використання
електронних документів вимагає розробки практичної системи їх класифікації –
такої, що забезпечуватиме адекватну і зрозумілу передачу змісту документів з
метою їх ідентифікації, упорядкованого зберігання та швидкого пошуку в
електронних ресурсах, передбачатиме класифікування і пошук за різними
критеріями (відповідно до специфіки електронних пошукових систем),
дозволить вільно оперувати електронними документами незалежно від зміни їх
типів, видів тощо.
Необхідність створення правил каталогізації електронних ресурсів,
бібліотечне опрацювання яких сприятиме якісному удосконаленню
інформаційно–бібліотечних сервісів, зумовлена збільшенням виробництва
інформації в електронному вигляді та швидким розвитком інформаційних
технологій, зокрема в бібліотеках.
Створення додатку «Електронна читальна зала» є актуальним, бо він
полегшує перегляд бібліотеки а також надає максимально комфортний і
адекватний доступ користувачів до бібліотечного фонду.
На сучасному етапі становлення інформаційного суспільства однією з
основних тенденцій розвитку електронних інформаційних ресурсів та
бібліотечно–інформаційних технологій являється розробка баз даних бібліотек і
створення електронних бібліотек, що дозволяє зробити даний додаток більш
актуальним.
11

1. АНАЛІЗ ФУНКЦІОНАЛЬНИХ ВЛАСТИВОСТЕЙ БІБЛІОТЕКИ


1.1 Організація роботи в стандартній бібліотеці

Бібліотека формує універсальний, з урахуванням профілю, бібліотечний


фонд, який відповідає змісту навчання у навчальному закладі, його
інформаційним і виховним функціям, запитам та інтересам користувачів,
забезпечує його належне розміщення, облік і зберігання. В нього включаються:
довідково–енциклопедичні, інформаційні видання з питань методики навчання,
психології, підручники, навчальні посібники і дидактичні матеріали, художня
література, періодичні видання, видання, що вийшли друком як в Україні, так і
за кордоном.
Основними завданнями бібліотеки є:
– здійснення організації, раціонального розміщення та обліку
основних і додаткових бібліотечних фондів, їх зберігання та
реєстрацію;
– систематичний аналіз використання бібліотечного фонду, веде
роботу з його популяризації;
– обслуговування читачів в режимі роботи абонемента та читального
зала.
Також бібліотека формує і веде довідково-бібліографічний апарат,
використовуючи традиційні і сучасні електронні носії інформації з метою
багатоаспектного бібліографічного розкриття бібліотечного фонду.
Дана кваліфікаційна робота прагне спростити роботу бібліотеки, а саме
ведення фондів читального залу та роботи з читачами у межах читального залу.

1.2 Вимоги до програмного продукту

Додаток повинен мати змогу вводити інформацію про необхідну книжку


та організовувати пошук за автором, назвою та жанром .Також додаток повинен
12

мати можливість запам’ятовувати котрий користувач, яку книжку відкрив.


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

1.3 Вимоги до програмного та апаратного забезпечення

Рекомендовані вимоги до програмного забезпечення для сервера:


 Open Server Ultimate – в ньому є все необхідне для роботи;
 Windows XP, 7, 8, 10.

Вимоги до програмного забезпечення для клієнта:


 Connector ODBC 5.3.6;
13

 Windows XP, 7, 8, 10.


Вимоги до апаратного забезпечення:
 тип процесора Intel Pentium 1400 MHz або краще;
 обсяг оперативного запам'ятовуючого пристрою 1 ГБ і більше;
 обсяг вільного місця на жорсткому диску 200 Мб і більше.

1.4 Огляд існуючих рішень

Аналізуючи обрану область, були переглянуті подібні програми для


читання книг.
Подібна програма «Cool Reader» призначена для читання книг у різних
форматах. Програма працює на багатьох операційних системах та має
відкритий код. Має функції для редагування оформлення книг, налаштування
сторінки читання, як зображено на рис. 1.1.

Рис. 1.1 – Форматування сторінки

Назва другої подібної програми «ICE Book Reader». Перевагами цієї


програми є – розпізнавання багатьох форматі книг, розвинена система
14

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


файли. Приклад вікна програми зображено на рис. 1.2.

Рис. 1.2 – Вигляд сторінки

Таким чином був зроблений аналіз подібних програм, та звернена увага


на недоліки цих програм.
15

2. ВИБІР ІНСТРУМЕНТАРІЮ ДЛЯ РОЗРОБКИ ДОДАТКУ


2.2 Вибір середовища розробки

Для виконання кваліфікаційної роботи була обрана мова програмування


С#, тому що ця мова містить в собі усі найкращі якості, всіх С подібних мов.
«Дідусем» С# є мова С. Від С мова С# успадкував синтаксис, багато
ключових слова та оператори. Крім того, С# побудований на покращеній
об'єктної моделі, визначеної в C++. Якщо розробник знає С або C++, то з С# не
виникне особливих проблем. С # і Java зв'язані між собою дещо складніше. Як
згадувалося вище, Java також є нащадком С і C++. У нього теж спільний з ними
синтаксис і схожа об'єктна модель. Подібно Java C# призначений для створення
переносимого коду. Проте С# – не нащадок Java. Швидше С# і Java можна
вважати двоюрідними братами, які мають спільних предків, але отримали від
батьків різні набори «генів». Останнім часом С і С++ є найбільш
використовуваними мовами для розробки комерційних і бізнес додатків. Ці
мови влаштовують багатьох розробників, але насправді не забезпечують
належної продуктивності розробки.
Наприклад, процес написання програми на С++ найчастіше займає значно
більше часу, ніж розробка еквівалентного програми, скажімо, на VisualBasic.
Зараз існують мови, які збільшують продуктивність розробки за рахунок втрати
в гнучкості, яка так звична і необхідна програмістам на С/С++.Подібні рішення
є вельми незручними для розробників і часто пропонують значно менші
можливості. Ці мови також не орієнтовані на взаємодію з з'являються сьогодні
системами і дуже часто вони не відповідають існуючій практиці програмування
для Web.
Багато розробники хотіли б використовувати сучасну мову, який дозволяв
би писати, читати і супроводжувати програми з простотою VisualBasic і в той
же час давав міць і гнучкість C++, забезпечував доступ до всіх функціональних
можливостей системи, взаємодіяв б з існуючими програмами і легко працював з
16

виникаючими Web стандартами. Враховуючи всі подібні побажання, Microsoft


розробила нову мову – C#. У нього входить багато корисних особливостей –
простота, об'єктна орієнтованість, типова захищеність, «збірка сміття»,
підтримка сумісності версій і багато іншого.
Дані можливості дозволяють швидко і легко розробляти програми,
особливо COM + додатки і Web сервіси. При створенні C#, його автори
враховували досягнення багатьох інших мов програмування: C++, C, Java,
SmallTalk, Delphi, VisualBasic і т.д. Треба відмітити що через те, що C #
розроблявся з чистого листа, у його авторів була можливість (якою вони явно
скористалися), залишити в минулому всі незручні і неприємні особливості
(існуючі, як правило, для зворотної сумісності), будь–якого з попередніх йому
мов. В результаті вийшов дійсно простий, зручний і сучасна мова, по
потужності не поступливий С++, але істотно підвищує продуктивність
розробок. Дуже часто можна простежити такий зв'язок – чим більше мова
захищена і стійкий до помилок, тим менше продуктивність програм, написаних
на ньому. Наприклад розглянемо дві крайнощі – очевидно це Assembler і Java.
У першому випадку розробник може досягти фантастичної швидкості своєї
програми, але доведеться дуже довго примушувати її працювати правильно не
на вашому комп'ютері.
У випадку з Java – розробник отримує захищеність, незалежність від
платформи, але, на жаль, швидкість програми навряд чи сумісна зі
сформованим поданням про швидкість, наприклад, якого–небудь окремого
клієнтського застосування (звичайно існують застереження – JIT компіляція та
інше).
Насправді скоро «збірка сміття», та й будь–які інші кроки до усунення
потенційних помилок стану відмітними рисами сучасної мови. В C#, як в
безсумнівно сучасній мові, також існують характерні особливості для обходу
можливих помилок. Наприклад, крім згаданої вище "збірки сміття", там всі
змінні автоматично ініціалізувалися середовищем і володіють типовою
17

захищеністю, що дозволяє уникнути невизначених ситуацій у випадку, якщо


програміст забуде ініціалізувати змінну в об'єкті або спробує провести
неприпустиме перетворення типів. Також в C# були зроблені заходи для
виключення помилок при оновленні програмного забезпечення. Зміна коду, в
такій ситуації, може непередбачувано змінити суть самої програми. Щоб
допомогти розробникам боротися з цією проблемою C# включає підтримку
сумісності версій (vesioning). Зокрема, на відміну від C++ і Java, якщо метод
класу був змінений, це повинно бути спеціально обумовлено. Це дозволяє
обійти помилки в коді і забезпечити гнучку сумісність версій. Також новою
особливістю є native підтримка інтерфейсів і спадкоємства інтерфейсів. Дані
можливості дозволяють розробляти складні системи і розвивати їх з часом. В
C# була уніфікована система типів, тепер розробник може розглядати кожен
тип як об'єкт. Незважаючи на те, використовуєте ви клас, структуру, масив або
вбудований тип, розробник може звертатися до нього, як до об'єкта.
Об'єкти зібрані в простори імен (namespaces), які дозволяють програмно
звертатися до чого–небудь. Це означає що замість списку включаються файлів
заголовків у своїй програмі розробник повинен написати які простори імен, для
доступу до об'єктів і класів усередині них, необхідно використовувати. У C#
вираз using дозволяє не писати кожен раз назву простору імен, коли
використовується клас з нього. Наприклад, простір імен System містить
декілька класів, в тому числі і Console. Можна писати або назву простору імен
перед кожним зверненням до класу, або використовувати using як це було
показано в прикладі вище.
Важливою і відмітною від С++ особливістю C# є його простота.
Приміром, чи завжди ви пам'ятаєте, коли пишіть на С++, де потрібно
використовувати «–>», де «::», а де «.»? Навіть якщо ні, то компілятор завжди
поправляє розробника у разі помилки. Це говорить лише про те, що насправді
можна обійтися тільки одним оператором, а компілятор сам буде розпізнавати
його значення.
18

Так в C#, оператор «–>» використовується дуже обмежено (в unsafe


блоках, про які мова піде нижче), оператор «::» взагалі не існує. Практично
завжди використовується тільки оператор «.» і розробнику більше не потрібно
стояти перед вибором. Ще один приклад. При написанні програм на C/С++
доводиться думати не тільки про типи даних, а й про їх розмір в конкретній
реалізації. В C# все спрощено – тепер символ Unicode називається просто char
(а не wchar_t, як в С++) і 64–бітове ціле тепер – long (а не int64).
Також в C# немає знакових і беззнакових символьних типів. В C#, також
як і в VisualBasic після кожного виразу case в блоці switch мається на увазі
break. І більше не буде відбуватися дивних речей якщо розробник забув
поставити цей break. Однак якщо дійсно необхідно щоб після одного виразу
case програма перейшла до наступного необхідно переписати свою програму з
використанням, наприклад, оператора goto. Багатьом програмістам (на той
момент, напевно, майбутнім програмістам) було не так легко під час вивчення
C++ повністю освоїтися з механізмом посилань і покажчиків. В C# (хтось зараз
пригадає про Java) немає покажчиків.
Насправді нетривіальність покажчиків відповідала їх корисності.
Наприклад, часом, важко уявити програмування без покажчиків на функції.
Відповідно до цього в C# присутні Delegates – як прямий аналог покажчика на
функцію, але їх відрізняє типова захищеність, безпека і повна відповідність
концепціям об'єктно–орієнтованого програмування. Хотілося б підкреслити
сучасну зручність C#.
Коли розробник починає роботу з C#, одразу видно, що досить велике
значення в ньому мають простору імен. Вже зараз, на основі першого прикладу,
ви можете судити про це – адже всі файли заголовків замінені саме простором
імен. Так в C#, крім просто вираження using, надається ще одна дуже зручна
можливість – використання додаткового імені (alias) простору імен або класу.
Сучасність C# виявляється і в нових кроках до полегшення процесу
налагодження програми. Традиційним засобом для налагодження програм на
19

стадії розробки в C++ є маркування великих частин коду директивами #ifdef і


т.д. В C#, використовуючи атрибути, орієнтовані на умовні слова, розробник
може куди швидше писати налагоджувати код.
У наш час, коли посилюється зв'язок між світом комерції і миром
розробки програмного забезпечення, і корпорації витрачають багато зусиль на
планування бізнесу, відчувається необхідність у відповідності абстрактних
бізнес процесів їх програмним реалізаціям. На жаль, більшість мов реально не
мають прямого шляху для зв'язку бізнес логіки та коду. Наприклад, сьогодні
багато програмістів коментують свої програми для пояснення того, які класи
реалізують якийсь абстрактний бізнес об'єкт. C# дозволяє використовувати
типізовані, розширювані метадані, які можуть бути прикріплені до об'єкта.
Архітектурою роботи можуть визначатися локальні атрибути, які будуть
пов'язані з будь–якими елементами мови – класами, інтерфейсами і т.д.
Розробник може програмно перевірити атрибути будь–якого елементу. Це
істотно спрощує роботу, наприклад, замість того щоб писати автоматизований
інструмент, який буде перевіряти кожен клас або інтерфейс, на те, чи є він
дійсно частиною абстрактного бізнес об'єкта, можна просто скористатися
повідомленнями заснованими на визначених в об'єкті локальних атрибутах.
C#, будучи останнім з широко поширених мов програмування, повинен
увібрати в себе весь наявний досвід і увібрати кращі сторони існуючих мов
програмування, при цьому будучи спеціально створеним для роботи в .NET.
Сама архітектура .NET продиктувала йому (як і багатьом іншим мовам, на яких
можна писати під .NET) об'єктно–орієнтовану спрямованість. Звичайно, це не є
правилом, можливе створення компіляторів навіть функціональних мов
по .NET, на цю тему існують спеціальні роботи. Свій синтаксис C# в чому
успадкував від C++ і Java. Розробники, які мають досвід написання програм на
цих мовах, знайдуть в C# багато знайомих. Але разом з тим він є багато в чому
новаторським – атрибути, делегати та події, прекрасно вписані в загальну
ідеологію мови, міцно зайняли місце в серцях .NET – розробників. Їх введення
20

дозволило застосовувати принципово нові прийоми програмування. Звичайно,


улюбленим об'єктом для порівняння з C# у світовій ком'юніті є Java. Також
розроблений для роботи в віртуальному середовищі виконання, має об'єктно–
орієнтовану архітектуру і збирач сміття, оснований на механізмі посилань.

2.3 Вибір середовища розробки БД

MySQL є рішенням для малих і середніх додатків. Входить до складу


серверів WAMP, AppServ, LAMP і в портативні збірки серверів Денвер,
XAMPP, VertrigoServ. Зазвичай MySQL використовується як сервер, до якого
звертаються локальні або видалені клієнти, проте в дистрибутив входить
бібліотека внутрішнього сервера, що дозволяє включати MySQL в автономні
програми.
Гнучкість СКБД MySQL забезпечується підтримкою великої кількості
типів таблиць: користувачі можуть вибрати як таблиці типу MyISAM, що
підтримують повнотекстовий пошук, так і таблиці InnoDB, що підтримують
транзакції на рівні окремих записів. Більш того, СКБД MySQL поставляється із
спеціальним типом таблиць EXAMPLE, що демонструє принципи створення
нових типів таблиць. Завдяки відкритій архітектурі і GPL–ліцензуванню, в
СКБД MySQL постійно з'являються нові типи таблиць.
Спільнотою розробників MySQL створені різні відгалуження коду, такі як
Drizzle, OurDelta, Percona Server і MariaDB. Всі ці відгалуження вже існували на
момент поглинання компанії Sun корпорацією Oracle.
БД являє собою структурований набір даних. Вона може містити різну
інформацію – від простого списку покупок до величезного обсягу даних, що
використовується в корпоративній мережі.
Реляційна БД зберігає інформацію в окремих таблицях, а не в одному
великому сховищі, завдяки чому досягається висока продуктивність і гнучкість.
SQL – найбільш загальний стандартизований мову доступу до баз даних; він
21

відповідає стандарту ANSI / ISO SQL. Стандарт SQL вперше був прийнятий в
1986 році і на даний час існує декілька його версій. У цьому посібнику «SQL–
92» посилається на стандарт, прийнятий в 1992 році, «SQL: одна тисяча
дев'ятсот дев'яносто дев'ять» – на стандарт, прийнятий в 1999 році, і «SQL:
2003» – на поточну версію стандарту.
Відкритість вихідного коду означає, що будь–який бажаючий має
можливість використовувати і модифікувати це програмне забезпечення на свій
розсуд. Отримати і розгорнути програмне забезпечення MySQL можна з
Internet, причому абсолютно безкоштовно. Кожен користувач, при бажанні,
може вивчити вихідні тексти і змінити їх відповідно до своїх потреб.
Програмне забезпечення MySQL розповсюджується за ліцензією GPL (GNU
General Public License), яка регламентує, що дозволено, а що ні по відношенню
до програмного забезпечення. Якщо з тих чи інших причин ліцензія GPL не
влаштовує або код MySQL потрібно вбудовувати в комерційні додатки, слід
придбати комерційну ліцензовану версію у компанії MySQL AB.
Сервер баз даних MySQL – дуже швидкий, надійний і простий в
експлуатації сервер. Сервер MySQL включає в себе практичний набір засобів,
розроблених в тісній кооперації з спільнотою користувачів. Спочатку сервер
MySQL був розроблений для більш швидкого управління великими базами
даних, ніж існуючі рішення в цій галузі, і протягом ряду років успішно
експлуатувався в середовищах, до яких пред'являлися досить високі вимоги.
Незважаючи на те що MySQL перебуває в безперервному процесі розробки, на
сьогоднішній день він надає багатий набір зручних в експлуатації засобів і
функцій. Притаманні сервера MySQL можливості мережевої взаємодії,
продуктивність і безпеку роблять його вдалим варіантом для роботи з базами
даних в Internet.
22

3. РОЗРОБКА ПРОГРАМНОГО ПРОДУКТУ


3.1 Схема і опис БД

Структура БД повинна вміщувати такі данні:


– про користувачів;
– про права користувачів;
– про книги та їх авторів;
– про активність користувачів.
Кожен користувач даної програми має 4 параметри, а саме ім’я, логін,
пароль та набір прав користувача.
Набір прав користувача включає в себе 4 права: додавання об’єктів,
редагування об’єктів, видалення об’єктів та контроль користувачів. Право
контролю користувачів дозволяє додавати, редагувати чи видаляти
користувачів з БД.
Список книг повинен вміщувати інформацію про назву книги, автора,
дату друку, жанр книги, формат файлу книги, коментар та шлях до файлу
книги. Відомості про автора необхідно винести в окрему таблицю, де можна
зберегти інформацію про повне ім’я автора, його дату народження та країну
походження.
Створена БД має в собі 10 таблиць, які пов’язані між собою.
У базі присутні 5 таблиць–переліків:
 країни;
 формати;
 жанри;
 дії;
 таблиці.
Також у базі представлені більші таблиці БД:
 автори;
 книги;
23

 користувачі;
 пакети прав користувачів;
 активність користувачів.
Таблиця користувачів (users) веде облік користувачів бази та пов’язана з
таблицею активності користувачів.
Визначення найменування, типів та розмірності стовбців таблиці БД users
показано у таблиці 3.1.

Таблиця 3.1
Визначення таблиці БД users
Назва поля Тип Розмірність
ID_User int 11
Name varchar 100
Login varchar 100
Password varchar 100
ID_UserRight int 11

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `users` (
`ID_User` int(11) NOT NULL,
`Name` varchar(100) DEFAULT NULL,
`Login` varchar(100) DEFAULT NULL,
`Password` varchar(100) DEFAULT NULL,
`ID_UserRight` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `users`
ADD PRIMARY KEY (`ID_User`),
ADD KEY `ID_UserRight` (`ID_UserRight`);
ALTER TABLE `users`
ADD CONSTRAINT `User_right` FOREIGN KEY (`ID_UserRight`) REFERENCES
`user_right` (`ID_Right`) ON DELETE CASCADE ON UPDATE CASCADE;
24

Таблиця пакетів прав користувачів (user_right) веде облік пакетів прав,


один з яких надається кожному користувачу. Пов’язана з таблицею
користувачів.
Визначення найменування, типів та розмірності стовбців таблиці БД
user_right показано у таблиці 3.2.

Таблиця 3.2
Визначення таблиці БД user_right
Назва поля Тип Розмірність
ID_Right int 11
Right_Name varchar 100
Book_Add int 11
Book_Edit int 11
Book_Delete int 11
User_Control int 11

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `user_right` (
`ID_Right` int(11) NOT NULL,
`Right_Name` varchar(100) NOT NULL,
`Book_Add` int(11) NOT NULL DEFAULT '0',
`Book_Delete` int(11) NOT NULL DEFAULT '0',
`Book_Edit` int(11) NOT NULL DEFAULT '0',
`User_Control` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user_right`
ADD PRIMARY KEY (`ID_Right`);

Таблиця книг (books) веде облік книг, які можна читати. Таблиця книг є
однією з двох основних таблиць.
Визначення найменування, типів та розмірності стовбців таблиці БД
books показано у таблиці 3.3.
Таблиця 3.3
Визначення таблиці БД books
25

Назва поля Тип Розмірність


ID_Book int 11
Назва поля Тип Розмірність
Name varchar 100
Genre int 11
Author int 11
Date_Print date
Comment varchar 1000
Format Int 11
Book_location varchar 1000

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `books` (
`ID_Book` int(11) NOT NULL,
`Name` varchar(100) DEFAULT NULL,
`Genre` int(11) NOT NULL DEFAULT '0',
`Author` int(11) NOT NULL DEFAULT '0',
`Date_Print` date NOT NULL DEFAULT '0000-00-00',
`Comment` varchar(1000) NOT NULL DEFAULT '0',
`Format` int(11) DEFAULT NULL,
`Book_location` varchar(1000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `books`
ADD PRIMARY KEY (`ID_Book`),
ADD KEY `Genre` (`Genre`),
ADD KEY `Format` (`Format`),
ADD KEY `Author` (`Author`);

ALTER TABLE `books`


ADD CONSTRAINT `Author` FOREIGN KEY (`Author`) REFERENCES `author`
(`ID_Author`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `Format` FOREIGN KEY (`Format`) REFERENCES `format`
(`ID_Format`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `Genre` FOREIGN KEY (`Genre`) REFERENCES `genre`
(`ID_Genre`) ON DELETE CASCADE ON UPDATE CASCADE;

Таблиця авторів (author) веде облік авторів, що написали книги, занесені


до таблиці книг. Пов’язана з таблицею книг.
26

Визначення найменування, типів та розмірності стовбців таблиці БД


author показано у таблиці 3.4.

Таблиця 3.4
Визначення таблиці БД author
Назва поля Тип Розмірність
ID_Author int 11
Name varchar 100
DOB date
ID_Nation int 11

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `author` (
`ID_Author` int(11) NOT NULL,
`Name` varchar(300) NOT NULL DEFAULT '0',
`DOB` date NOT NULL DEFAULT '0000-00-00',
`ID_Nation` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `author`
ADD PRIMARY KEY (`ID_Author`),
ADD KEY `ID_Nation` (`ID_Nation`);
ALTER TABLE `author`
ADD CONSTRAINT `Author_nation` FOREIGN KEY (`ID_Nation`) REFERENCES
`nation` (`ID_Nation`) ON DELETE CASCADE ON UPDATE CASCADE;

Таблиця країн (nation) веде облік країн, до яких належать автори.


Пов’язана з таблицею авторів.
Визначення найменування, типів та розмірності стовбців таблиці БД
nation показано у таблиці 3.5.

Таблиця 3.5
Визначення таблиці БД nation
Назва поля Тип Розмірність
ID_Nation int 11
27

Nation varchar 100

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `nation` (
`ID_Nation` int(11) NOT NULL,
`Nation` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `nation`
ADD PRIMARY KEY (`ID_Nation`);

Таблиця форматів (format) веде облік форматів, у яких збережені файли


книг. Пов’язана з таблицею книг. При створенні елементу таблиці необхідно
створювати папку в корні папки, яка буде вказана у глобальній змінній шляху
збереження файлів. При редагуванні запису необхідно перейменовувати стару
папку. При видаленні запису необхідно видаляти папку та все що в ній
знаходиться.
Визначення найменування, типів та розмірності стовбців таблиці БД
format (таблиця форматів) показано у таблиці 3.6.
Таблиця 3.6
Визначення таблиці БД format
Назва поля Тип Розмірність
ID_Format int 11
Format varchar 100

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `format` (
`ID_Format` int(11) NOT NULL,
`Format` varchar(50) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `format`
ADD PRIMARY KEY (`ID_Format`);

Таблиця жанрів (genre) веде облік жанрів, у яких написано книги,


занесені до таблиці книг та пов’язана з нею. При створенні елементу таблиці
28

необхідно створювати папки в усіх папках форматів. При редагуванні запису


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

Таблиця 3.7
Визначення таблиці БД genre
Назва поля Тип Розмірність
ID_Genre int 11
Genre varchar 100

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `genre` (
`ID_Genre` int(11) NOT NULL,
`Genre` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `genre`
ADD PRIMARY KEY (`ID_Genre`);

Таблиця активності користувачів (user_activity) веде облік усіх виконаних


дій у базі даних. До цих дії входять:
– додавання даних;
– редагування даних;
– видалення даних;
– авторизація.
Таблиця активності користувачів є однією з двох основних таблиць БД.
Визначення найменування, типів та розмірності стовбців таблиці БД
user_activity показано у таблиці 3.8.

Таблиця 3.8
Визначення таблиці БД user_activity
29

Назва поля Тип Розмірність


ID int 11
Назва поля Тип Розмірність
ID_Users int 11
ID_Action int 11
ID_Tables int 11
User_Name varchar 100
Action_Name varchar 100
Tables_Name varchar 100
Value varchar 300
Date_Activity date
Chapter int 11

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `user_activity` (
`ID` int(11) NOT NULL,
`ID_Users` int(11),
`ID_Action` int(11),
`ID_Tables` int(11) DEFAULT NULL,
`User_Name` varchar(100) NOT NULL,
`Action_Name` varchar(100) NOT NULL,
`Tables_Name` varchar(100) DEFAULT NULL,
`Value` varchar(300) DEFAULT NULL,
`Date_Activity` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`Chapter` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user_activity`
ADD PRIMARY KEY (`ID`),
ADD KEY `ID_Users` (`ID_Users`),
ADD KEY `ID_Action` (`ID_Action`),
ADD KEY `ID_Tables` (`ID_Tables`);
ALTER TABLE `user_activity`
ADD CONSTRAINT `Action` FOREIGN KEY (`ID_Action`) REFERENCES `action`
(`ID_Action`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `Tables` FOREIGN KEY (`ID_Tables`) REFERENCES `tables`
(`ID_Tables`) ON DELETE NO ACTION ON UPDATE NO ACTION,
ADD CONSTRAINT `User` FOREIGN KEY (`ID_Users`) REFERENCES `users`
(`ID_User`) ON DELETE NO ACTION ON UPDATE NO ACTION;
COMMIT;
30

Таблиця існуючих таблиць БД (tables) веде облік таблиць, присутніх у


базі даних. Дана таблиця не підлягає редагуванню та слугує у вигляді таблиці–
переліку. Пов’язана з таблицею активності користувачів.
Визначення найменування, типів та розмірності стовбців таблиці БД
tables показано у таблиці 3.9.
Таблиця 3.9
Визначення таблиці БД tables
Назва поля Тип Розмірність
ID_Tables int 11
Tables varchar 50

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `tables` (
`ID_Tables` int(11) NOT NULL,
`Tables` varchar(50) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `tables`
ADD PRIMARY KEY (`ID_Tables`);

Таблиця можливих дій (action) веде облік дій, можливих по відношенню


до БД. Дана таблиця не підлягає редагуванню та слугує у вигляді таблиці–
переліку. Пов’язана з таблицею активності користувачів.
Визначення найменування, типів та розмірності стовбців таблиці БД
action показано у таблиці 3.10.

Таблиця 3.10
Визначення таблиці БД action
Назва поля Тип Розмірність
ID_Action int 11
Action varchar 50
31

Нижче наведено SQL–код створення даної таблиці:


CREATE TABLE `action` (
`ID_Action` int(11) NOT NULL,
`Action` varchar(50) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `action`
ADD PRIMARY KEY (`ID_Action`);

Схема структури БД показана на рис. 3.1.

Рис. 3.1 – Схема структури БД

3.2 Опис розробки інтерфейсу програми

Програма має структуру клієнт–сервер. У ролі серверу виступає Open


server, який дозволяє працювати із базою даних та Ftp сервером. У ролі клієнта
виступає програма, що за допомогою авторизації буде зв’язуватись з сервером,
як зображено на рис. 3.2.
32

Рис. 3.2 – Схема зв’язків програми у локальній мережі

Виходячи з функціональних вимог доцільно розробити наступні екранні


форми: форма авторизації, форма головного меню, форма налаштування
підключення, форма налаштування користувачів, форма налаштування прав
користувачів, форма перегляду доступних книг, форма редактору авторів, та
інші допоміжні форми. У кінцевому результаті програма має 19 форм.
Було створено 17 глобальних змінних:
 User_Name – ім’я поточного користувача;
 User_ID – логін поточного користувача;
 User_Password – пароль поточного користувача;
 User_Log_ID – ID поточного користувача;
 Data_Base_IP – ІР адреса підключення до бази;
 Data_Base_Name – назва бази;
 Server_Log – логін підключення до серверу;
 Server_Password – пароль підключення до серверу;
 Add – можливість створення у поточного користувача;
 Delete – можливість видалення у поточного користувача;
33

 Edit – можливість редагування у поточного користувача;


 UserControl – можливість контролю користувачів у поточного
користувача;
 Port – порт підключення до серверу MySql;
 User_Rights – Назва пакету прав поточного користувача;
 Change_User_ID – ID користувача, який буде змінюватися;
 Change_Book_ID – ID книги, який буде змінюватися;
 Change_Author_ID – ID автора, який буде змінюватися;
 File_Disk_Folder – шлях до основної папки збереження файлів книг.
При розробці додатку необхідно було створити по 4 запити до кожної
таблиці:
 запит типу SELECT;
 запит типу INSERT;
 запит типу DELETE;
 запит типу UPDATE.
Створення запитів показано на прикладі таблиці Книги.
Для виконання кожного с цих запитів необхідно, перед цим,
підключитись до самої бази. Підключення було реалізовано у кожному методі,
який працює з базою даних у подібному вигляді:
private void Load_reload(object sender, EventArgs e)
{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
34

MyCommand.Connection = MyConnection;
MyConnection.Open();

DataSet setdata = new DataSet();


MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT *
FROM books", MyConnection);
dataAdapter.Fill(setdata, "books");
dataGridView1.DataSource = setdata.Tables["books"];

MyConnection.Close();
}
catch
{
MainMenu f = new MainMenu();
Exit = false;
Hide();
MessageBox.Show("Нет подключения к базе данных.", " Eror",
MessageBoxButtons.OK, MessageBoxIcon.Error);

}
}

Цей метод проводить підключення до бази


string Connect = "server=" + KURSACH_III.Properties.Settings.Default.Data_Base_IP
+ ";database=" + KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;
MyConnection.Open();

та вибирає усі присутні дані з таблиці книги та заносить їх у елемент


DataGridView1 для подальшого відображення.
DataSet setdata = new DataSet();
MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT *
FROM books", MyConnection);
dataAdapter.Fill(setdata, "books");
dataGridView1.DataSource = setdata.Tables["books"];
35

Для створення нового рядка у таблиці «Книги» використовується


наступний метод:
private void Add_Click(object sender, EventArgs e)
{
try
{
if (!String.IsNullOrWhiteSpace(BookName.Text) && !
(AuthorList.SelectedItem == null) && !String.IsNullOrWhiteSpace(Comment.Text) && !
String.IsNullOrWhiteSpace(AddBookDate.Value.ToString()) && !(AddBookGenre.SelectedItem
== null) && !(Format_List.SelectedItem == null))
{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new


MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;
ID_Identify("author", AuthorList.SelectedItem.ToString(),
"ID_Author", "Name");
int Author_ID = ID;
ID_Identify("genre",
AddBookGenre.SelectedItem.ToString(), "ID_Genre", "Genre");
int Genre_ID = ID;
ID_Identify("format",
Format_List.SelectedItem.ToString(), "ID_Format", "Format");
int Format_ID = ID;
MyConnection.Open();
MyCommand.CommandText = "INSERT INTO books (Name, Genre,
Author, Date_Print, Comment, Format) VALUES (@Name, @Genre, @Author, @Date_Print,
@Comment, @Format)";
MySqlParameter Parameter = new MySqlParameter();
Parameter.ParameterName = "@Name";
36

Parameter.Value = BookName.Text;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);
Parameter = new MySqlParameter();
Parameter.ParameterName = "@Genre";
Parameter.Value = Genre_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);
Parameter = new MySqlParameter();
Parameter.ParameterName = "@Author";
Parameter.Value = Author_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);
Parameter = new MySqlParameter();
Parameter.ParameterName = "@Date_Print";
Parameter.Value = "" + AddBookDate.Value.Year + "." +
AddBookDate.Value.Month + "." + AddBookDate.Value.Day + "";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);
Parameter = new MySqlParameter();
Parameter.ParameterName = "@Comment";
Parameter.Value = Comment.Text;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);
Parameter = new MySqlParameter();
Parameter.ParameterName = "@Format";
Parameter.Value = Format_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

MyCommand.ExecuteNonQuery();
MyConnection.Close();

MessageBox.Show("Новая книга успешно добавлен");


Close();
}
catch (Exception ex)
{MessageBox.Show(ex.Message);}
}
else
37

{
MessageBox.Show("Необходимо заполнить все поля", " Eror",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{MessageBox.Show(ex.Message);}
}

Цей метод перевіряє, чи дані занесені у всі поля і, якщо всі поля
заповнені, продовжує процес створення рядка таблиці. Запит реалізовано у
такому вигляді:
MyCommand.CommandText = "INSERT INTO books (Name, Genre, Author, Date_Print,
Comment, Format) VALUES (@Name, @Genre, @Author, @Date_Print, @Comment, @Format)";

Значення для параметрів беруться з полів форми.


Parameter = new MySqlParameter();
Parameter.ParameterName = "@Comment";
Parameter.Value = Comment.Text;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Запит UPDATE був реалізований у наступному методі:


private void Change_Click(object sender, EventArgs e)
{
if (!(BookName.Text == Book_Name) || !(AddBookDate.Value ==
Book_Date) || !(Format_List.SelectedItem.ToString() == Book_Format) || !
(AuthorList.SelectedItem.ToString() == Author) || !
(AddBookGenre.SelectedItem.ToString() == Genre) || !(Comment.Text == Book_Comment))
{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;
38

ID_Identify("author", AuthorList.SelectedItem.ToString(),
"ID_Author", "Name");
int Author_ID = ID;
ID_Identify("genre", AddBookGenre.SelectedItem.ToString(),
"ID_Genre", "Genre");
int Genre_ID = ID;
ID_Identify("format", Format_List.SelectedItem.ToString(),
"ID_Format", "Format");
int Format_ID = ID;
MyConnection.Open();
MyCommand.CommandText = "UPDATE books SET Name ='" +
BookName.Text + "', Genre ='" + Genre_ID + "', Author ='" + Author_ID + "',Date_Print =
'" + AddBookDate.Value.Year + "." + AddBookDate.Value.Month + "." +
AddBookDate.Value.Day + "', Comment ='" + Comment.Text + "', Format ='" + Format_ID +
"' WHERE ID_Book ='" + Properties.Settings.Default.Change_Book_ID + "'";
MyCommand.ExecuteNonQuery();
MessageBox.Show("Книга успешно обновлена");
MyCommand.ExecuteNonQuery();
MyConnection.Close();
Close();
}
catch (Exception ex)
{MessageBox.Show(ex.Message);}
}
else
{MessageBox.Show("Вы ничего не изменили!");} }

Метод перевіряє, чи були змінені дані хоча б в одному полі, та оновлює ці


дані у таблиці БД.
Запит DELETE був реалізований у наступному методі:
private void Delete_Book_Click(object sender, EventArgs e)
{
string BookID;
BookID = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
39

KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +


KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();

MyCommand.CommandText = "DELETE FROM books WHERE ID_Book ='" + BookID


+ "'";
MyCommand.Connection = MyConnection;
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();

Load_reload(sender, e);
}

Форма авторизації потрібна для того, щоб визначити хто заходить до


програми та визначити який рівень доступу він має. Приклад форми зображено
на рис. 3.3.

Рис. 3.3 – Форма авторизації


40

На даній формі користувач має можливість перейти до форми


налаштування підключення до серверу. Приклад форми налаштування
підключення зображено на рис. 3.4.

Рис. 3.4 – Форма налаштувань підключення


Для збереження файлів на сервері, обов’язково необхідно вказати
кореневу папку зберігання файлів. Приклад діалогового вікна наведено на рис.
3.5.
41

Рис. 3.5 – Діалогове вікно вибору основної папки збереження файлів

Головне меню дає користувачу можливість змінити поточного


користувача або перейти до інших форм:
 форми налаштування користувачів;
 форми списку книг.;
 форми активності користувачів.
Приклад форми головного меню наведено на рис. 3.6.
42

Рис. 3.6 – Форма головного меню

Форма налаштування користувачів дозволяє керувати користувачами


програми, якщо є потрібний рівень дозволу. Адміністратор має змогу додавати
чи редагувати користувачів та має доступ до форми налаштування прав
користувачів. Приклад форми наведено на рис. 3.7.

Рис. 3.7 – Форма налаштування користувачів


43

Форма налаштування прав користувачів дає адміністратору можливість


створювати, редагувати та видаляти пакети прав для користувачів. Приклад
форми наведено на рис. 3.8.

Рис. 3.8 – Форма налаштування прав користувачів

Форма списку книг містить у собі таблицю книг та виводить коментар


обраної книги. До цієї таблиці існує панель фільтрації записів. Також
користувачу надається можливість створення, редагування та видалення
записів з цієї таблиці. Приклад форми зображено на рис. 3.9.

Рис. 3.9 – Форма списку книг


44

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


Форма редагування книг схожа з попередньою. Приклад форм зображено на
рис. 3.10.

Рис. 3.10 – Форма додавання книг


Форми редактору жанрів та редактору форматів мають схожу структуру.
Кожна форма дає можливість користувачу додавати, редагувати та видаляти
записи з однойменних таблиць. Приклади форм наведені на рис. 3.11 та рис.
3.12.

Рис. 3.11 – Форма редактору жанрів


45

Рис. 3.12 – Форма редактору форматів

Форма редактору авторів містить в собі таблицю з даними про авторів та


панель фільтрації записів. Приклад наведено на рис. 3.13.

Рис. 3.13 – Форма редактору авторів


46

Форми додавання та редагування авторів схожі між собою. Приклади наведено


на рис. 3.14 та рис. 3.15.

Рис. 3.14 – Форма додавання авторів

Рис. 3.15 – Форма редагування авторів

Форма редактору країн схожа з формами редактору жанрів та редактору


форматів. Приклад наведено на рис. 3.16.
47

Рис. 3.16 – Форма редактору країн

Форма активності користувачів відображає усі дії щодо відношення до


БД.
Дані до цієї таблиці заносяться в момент виконання будь якої дії з вище
вказаних. На формі присутня панель фільтрації записів. Приклад наведено на
рис. 3.17.

Рис. 3.17 – Форма активності користувачів

Форма читання книги виводить текст що міститься у файлі книги. Текст


виводиться по одній главі. Користувач має можливість вільно перемотувати
48

глави книги за допомогою двох кнопок. Перед відкриттям форми додаток


робить запит до БД з метою визначити, чи користувач читав обрану ним книгу.
При позитивному результаті книга відривається одразу на тій главі, на якій
зупинився користувач.
Нижче наведений фрагмент коду форми читання.
private void WasRead()
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "SELECT Chapter FROM user_activity WHERE


ID_Users ='" + KURSACH_III.Properties.Settings.Default.User_Log_ID +
"' AND ID_Action = 6 AND Value ='" + Book_Name + "' AND
Date_Activity = (SELECT MAX(Date_Activity) FROM user_activity WHERE ID_Users ='" +
KURSACH_III.Properties.Settings.Default.User_Log_ID +
"' AND ID_Action = 6 AND Value ='" + Book_Name + "')";
MyConnection.Open();

MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
Book_Chapter = Reader.GetFieldValue<int>(0);
}
}

private void FB2_Reader()


{
Book_File_Pass = Regex.Unescape(Book_File_Pass.Replace("\\", "/"));
XDocument doc = XDocument.Load(Book_File_Pass);
49

var namespaceManager = new XmlNamespaceManager(new NameTable());


XNamespace ns = "http://www.gribuser.ru/xml/fictionbook/2.0";

var body = doc.Root.Elements(ns + "body").ToArray();


XDocument doc2 = XDocument.Parse(body[0].ToString());
var SectionArray = doc2.Root.Elements(ns + "section").ToList();
Nodes = SectionArray[0].Nodes().ToList();
MaxPage = Nodes.LastIndexOf(SectionArray[0].LastNode);

WasRead();

Chapter_Out(Book_Chapter);

private void Chapter_Out(int Chapter = 0)


{
XText Chapter_Text = new
XText(((System.Xml.Linq.XElement)Nodes[Chapter]).ToString());
string newChapter = Chapter_Text.Value.ToString();

while (true)
{
var lb = newChapter.IndexOf('<');
var rb = newChapter.IndexOf('>');
if ((rb < 0) || (lb < 0)) break;
newChapter = newChapter.Remove(lb, rb - lb+ 1);
}

Book_Text.Text = newChapter;
}

private void Reader_FormClosed(object sender, FormClosedEventArgs e)


{
if (Exit)
{
DialogResult df = MessageBox.Show("Вы действительно хотите
выйти?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
50

if (df == DialogResult.Yes) { Application.Exit(); } else {


Reader f = new Reader();
Exit = false; this.Hide(); f.ShowDialog();
}
}
}

Три наведених вище методи виконують відкриття, читання та вивід файлу


книги у форматі .fb2 до користувача.
Приклад форми читання книги наведено на рис. 3.18.

Рис. 3.18 – Форма читання книги

3.3 Обмеження ведення БД

В процесі створення БД необхідно підтримувати цілісність між


введеними даними.
51

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


у поля вибору зі списку даних. Ці методи задають певні обмеження у виборі
варіантів, дозволяючи вибирати лише ті, що вже занесені у базу даних.
private void Collection_List()
{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MyConnection.Open();
MySqlCommand MyCommand = new MySqlCommand();
MyCommand.CommandText = "SELECT Genre FROM genre";
MyCommand.Connection = MyConnection;

MySqlDataReader Reader3 = MyCommand.ExecuteReader();

AddBookGenre.Items.Clear();

while (Reader3.Read())
{
AddBookGenre.Items.Add(Reader3.GetString(0));

}
Reader3.Close();

MyConnection.Close();

MyCommand.CommandText = "SELECT Name FROM author";


MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlDataReader Reader4 = MyCommand.ExecuteReader();


52

AuthorList.Items.Clear();

while (Reader4.Read())
{
AuthorList.Items.Add(Reader4.GetString(0));

}
Reader4.Close();

MyConnection.Close();

MyCommand.CommandText = "SELECT Format FROM format";


MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlDataReader Reader5 = MyCommand.ExecuteReader();

Format_List.Items.Clear();

while (Reader5.Read())
{
Format_List.Items.Add(Reader5.GetString(0));
}
Reader5.Close();

MyConnection.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

Цей метод вибирає дані з таблиць, в яких є тільки дві колонки ID та


Назва, та заносить у задані поля списку, у властивість Items.
Після вибору варіанту та запису даних у базу спрацьовує інший метод,
який знаходить в потрібній таблиці обрану назву та вибирає ID цього рядка.
53

private void ID_Identify(string table, string name, string id_name, string


name_column)
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "SELECT " + id_name + " FROM " + table + "


WHERE " + name_column + " ='" + name + "'";
MyConnection.Open();
MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
ID = Reader.GetFieldValue<int>(0);
}
Reader.Close();
MyConnection.Close();
}

В цей метод передається чотири параметри:


 table – назва таблиці у базі даних.
 name_column – назва стовбця у таблиці.
 name – значення у стовбці, по якому робиться відбір.
 id_name – назва стовбця зі значенням ID в обраній таблиці.
В процесі виконання методу значення ID заноситься у глобальну змінну
форми ID, з якої пізніше отримується у потрібну змінну для занесення до БД.
Приклад команди запиту методу ID_Identify після отримання параметрів:
MyCommand.CommandText = "SELECT Format FROM format WHERE ID_Format = 1";
54

Ці два методи призначені для нормалізації роботи з полями та стовбцями


таблиць з префіксом ID.

3.4 Тестування програмного продукту

Задля надійності і стійкості програми, були розроблені різного виду


перевірки у програмі.
На формі авторизації знаходиться індикатор підключення до серверу. Він
знаходиться у правому верхньому кутку форми (див. рисунок 3.19).

Рис. 3.19 – Робота маркеру підключення до серверу

При спробі підключитись з програми до БД, програма перевірить чи є


з’єднання. Якщо зв’язку з базою даних немає, то програма виведе відповідне
повідомлення, яке зображено на рис. 3.20.
55

Рис. 3.20 – Вікно помилки при підключенні

Коли користувач авторизується, програма перевіряє, які дані ввів


користувач. При вводі невірного логіну чи паролю, програма виведе помилку
біля поля введення, як зображено на рис. 3.21.

Рис. 3.21 – Помилка при неправильній авторизації

В програмі існує перевірка прав користувачів. Якщо авторизований


користувач, який не має прав працювати з книгами намагатиметься створити чи
видалити книгу, програма заблокує йому цю дію. Приклад наведено на рис.
3.22. та рис. 3.23.
56

Рис. 3.22 – Неактивні пункти меню у користувача, який не має прав на


редагування таблиці користувачів.

Рис.3.23 – Активні пункти меню у користувача з повними правами

У програмі присутні функції фільтрації записів у таблицях. Для


використання фільтру необхідно ввести дані для відбору мінімум в одне поле з
представлених чотирьох. Після вводу необхідно натиснути на кнопку
«Отобрать». Відібрані дані будуть виведені у верхній частині форми.
57

Для скидання фільтру необхідно натиснути на кнопку «Обновить


Сбросить фильтры». Фільтр буде скинуто, і дані будуть відображатись у всій
кількості.
Приклад наведено на рис. 3.24 та рис. 3.25.

Рис. 3.24 – Форма списку книг до фільтрації даних

Рис. 3.25 – Форма списку книг після фільтрації даних


58

4. РОЗРАХУНОК ЕКОНОМІЧНОГО ЕФЕКТУ ВІД РОЗРОБКИ


І ПРОДАЖУ ПРОГРАМИ

4.1. Визначення витрат на розробку програми


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

З = ФОТ + Отч + Накл + Зпевм., (4.1)


де ФОТ – фонд оплати праці, грн;
Отч – відрахування до позабюджетних фондів, грн;
Накл – накладні витрати, пов'язані із створенням програми, грн;
Зпевм – витрати, пов'язані з експлуатацією програми, грн.

З = 7762,5 + 2018,25 + 27116,88 + 248 = 12745,63 (грн).

Розмір фонду оплати праці розробника розраховується по формулі:

ФОТ = Зппрям  (1 + Кр / 100) (4.2)


де Зппрям – пряма заробітна плата, грн;
Кр – районний коефіцієнт % (Кр = 15 %).

ФОТ = 6750  (1+15/100)= 7762,5 (грн)

Зппрям=СР  Окл., (4.3)


де СР – повний термін розробки програми, міс. (днів);
Окл – оклад (денна тарифна ставка) розробника, грн.

Оклад = 4500 / 20 = 225 (грн)


Зппрям=30  225 = 6750 (грн)
59

Час, що реально витрачається розробником на створення системи


приведено в табл.4.1.
Таблиця 4.1.
Терміни на розробку програми
Термін, відведений на стадію розробки (днів)
Стадія розробки
Всього В т.ч. машинного часу
1. Передпроектна стадія 2
2. Проектування 10 6
3. Програмування 13 15
4. Випробування 5 10
Разом: 30 31

Розрахунок страхових внесків до позабюджетних фондів проводиться по


формулі:

Отч = ФОТ  (Котч / 100), (4.4)


де Котч – відсоток відрахувань % (Котч = 26%);

Отч = 7762,5  (26 / 100) = 2018,25 (грн).


Накладні витрати, пов'язані із створенням програми, складають 35% від
ФОТ і розраховуються по формулі:
Накл = ФОТ  0,35. (4.5)

Накл = 7762,5  0,35 = 2716,88 (грн)

Витрати пов'язані з експлуатацією ПЕВМ, розраховуються по формулі:

Зпевм = tмаш  Смаш.час (4.6)


60

де tмаш – повний машинний час, витрачений в процесі розробки програми (час


написання програми, комплексирования і випробування), година;

Смаш. година – вартість машино–години, грн/година.


Зпевм = 31  8  1 = 248 (грн)
4.2. Розрахунок вартості програми
Вартість розробленої програми визначається по формулі:
Ціна = З  (1 + Нормпр / 100) (4.7)
де Нормпр – норма прибутку %, (Нормпр = 25 %).

Ціна = 12745,63  (1 + 25 / 100) = 15932,03 (грн)


4.3. Розрахунок економічного ефекту від продажу програми
Економічний ефект від продажу програми визначається за формулою:
ЕФ = Кіл  Ціна – Кіл  З – Кіл  Ціна Зрекл / 100 (4.8)
де Зрекл – витрати на рекламу % на одиницю проданої продукції (Зрекл = 1 %).
Кіл – гадана кількість проданих одиниць продукту, шт/рік.

ЕФ = 100  15932,03 – 100 12745,63 – 100  15932,03 1 / 100 = 302 708,59 (грн).

Таким чином економічний ефект від продажу розробленої програми


складає 302 708,59 гривень на рік.
61

5. ОХОРОНА ПРАЦІ

5.1 Перелік потенційно небезпечних і шкідливих чинників на виробництві

Під час роботи на виробництві на людину можуть впливати один, або


низка небезпечних та шкідливих виробничих факторів. Безпека того чи іншого
технологічного процесу може бути визначена за їх кількістю і за ступенем
небезпеки кожного з них зокрема. Всі фактори класифіковані по ряду ознак,
основним з яких є характер взаємодії з людиною. 
За цією ознакою фактори поділяються на три групи: активні, активно-
пасивні, пасивні.
До активної групи належать фактори, які можуть вплинути на людину за
допомогою ув'язнених у них енергетичних ресурсів. 
По виду енергії фактори цієї групи поділяються на наступні підгрупи:
механічні, термічні, електричні, електромагнітні, хімічні, біологічні,
психофізіологічні. 
До пасивно-активної групи належать фактори, що активізуються за
рахунок енергії, носієм якої є людина і елементи природного та виробничого
середовища. Наприклад, гострі (колючі та ріжучі) нерухомі предмети і
елементи; незначний коефіцієнт тертя між
дотичними поверхнями, нерівності поверхні, по якій переміщується людина і
машини в процесі діяльності, ухили і підйоми. 
До пасивних факторів відносяться фактори, які проявляються
опосередковано в часі. Ці чинники виникають за такими ознаками: 
– небезпечним властивостям, пов'язаних з корозією металів; 
– утворенням накипу на поверхнях; 
– недостатньою міцністю і стійкістю конструкцій; 
– високим навантаженням на механізми і машини і т.п. 
62

Формою прояву цих факторів є руйнування, загоряння, вибухи та інші


види аварій і катастроф. 
Слід розглянути чинники, вплив яких характеризуються наступними
ознаками: 
Можливим характером дії на організм людини:
– структурою або будовою;
– наслідками; 
– збитками. 
За можливого характером дії на людину розрізняють безпосередні й
опосередковані фактори. 
Чинники, що роблять безпосередній вплив на організм людини,
характеризуються дією самої величини параметрів. 
Наприклад, галас по впливу характеризується рівнем інтенсивності, рівнем
гучності, середньогеометричною частотою. 
Вібрація  – амплітудою, рівнем коливальної швидкості, частотним
діапазоном. 
Світловий клімат – освітленістю, силою світла, яскравістю і кольором
фону, контрастністю між об'єктом розрізнення і фоном. 
Дія непрямих факторів, як правило, носить прихований характер і їх прояв
можливо раптово, як за часом, так і за спрямованістю, і за інтенсивністю
впливу. 
За структурою або будовою розрізняють прості і похідні чинники. 
Прості чинники – це фактори спрямованої дії різних потенційних
небезпек. Так, до них можна віднести електричний струм,
високу забрудненість повітря, гідросфери та ін.
Похідні – чинники, що породжуються взаємодією простих факторів.
Наприклад, вибухи, пожежі. 
За наслідками розрізняють фактори, що викликають стомлення людини і
його захворювання, а також травматизм, аварії, пожежі, катастрофи та НС. 
63

До стомлення, як правило, призводять нервово-


психічні, психосоматичні та фізичні перевантаження організму, порушення
ритму життєдіяльності, невідповідні умови праці та ін. 
Захворювання розглядаються як загальні та професійні. Захворювання
можуть бути: невеликої тяжкості, середньої тяжкості, тяжкими, з летальним
(смертельним) результатом. 
За викликається збитку розрізняють фактори, що приносять соціальний,
економічний, екологічний та навіть політичний збитки. 
Соціальний збиток виявляється в результаті погіршення здоров'я людини,
зниження тривалості його життя і трудового довголіття, перешкоди
гармонійному розвитку особистості та ін. 
Отже, основним завданням БЖД є забезпечення умов, спрямованих на
збереження здоров'я та життя працюючих, як трудового ресурсу країни. 
Здоров'я кожної людини, в тому числі і нації в цілому, залежить від цілої
сукупності чинників, які умовно можна об'єднати в такі групи: 
Генетичні особливості (спадковість); 
– екологічна обстановка; 
– фактори трудового процесу; 
– фактори виробничого середовища; 
– умови праці; 
– соціальне середовище; 
– спосіб життя. 
У розглянутій ланцюга сукупних факторів, що впливають на здоров'я
людини, і створюють небезпеку, остання може призвести до зміни не тільки
генетичних особливостей самої особистості і (або) її потомства, а й способу
життя в результаті придбаних залежностей (наркоманія, алкоголізм). 
Економічний збиток виражається зниженням продуктивності праці, невиходу
на роботу, оплатою лікарняних листів, недовипуском продукції і зниженням її
якості і т.д. 
64

Екологічний збиток - це збиток, нанесений навколишньому середовищі


аваріями, катастрофами, НС, браконьєрством будь-якого виду. 
Політичний збиток виражається у вигляді втрати престижу. 
Знання факторів і впливає початку на об'єкт дає можливість формувати різні
заходи, спрямовані на забезпечення виробничої безпеки, а також розробляти
засоби і системи безпеки.

5.2 Технічні рішення та організаційні заходи із гігієни праці, виробничої


санітарії та техніки безпеки

Виробнича санітарія — це система організаційних і технічних заходів, які


направлені на усунення потенціальних небезпечних факторів і запобігання
професійних захворювань та отруєнь.
До організаційних заходів належать:
– дотримування вимог охорони праці (далі ОП) жінок та осіб віком до 18
років; проведення попередніх та періодичних медичних оглядів осіб, які
працюють у шкідливих умовах;
– забезпечення працюючих у шкідливих умовах лікувально-
профілактичним обслуговуванням.
– До технічних заходів належать:
– систематичне підтримання чистоти в приміщеннях і на робочому місці;
– улаштування систем опалення, вентиляції і кондиціювання робочих
місць;
забезпечення працюючих від шуму вібрації, ультра- та інфразвуку, вібрації,
різних видів випромінювання.
5.3 Безпека в надзвичайних ситуаціях

З метою забезпечення сприятливих для здоров'я умов праці, високого


рівня працездатності, профілактики травматизму і професійних захворювань,
65

отруєнь та відвернення іншої можливої шкоди для здоров'я на підприємствах, в


установах і організаціях різних форм власності повинні встановлюватися єдині
санітарно-гігієнічні вимоги до організації виробничих процесів, пов'язаних з
діяльністю людей, а також до якості машин, обладнання, будівель та інших
об'єктів, які можуть мати шкідливий вплив на здоров'я. Всі державні стандарти,
технічні умови і промислові зразки обов'язково погоджуються з органами
охорони здоров'я в порядку, встановленому законодавством. Власники і
керівники підприємств, установ та організацій зобов'язані забезпечити в їхній
діяльності виконання правил техніки безпеки, виробничої санітарії та інших
вимог щодо охорони здоров'я, передбачених законодавством, не допускати
шкідливого впливу на здоров'я людей.
Роботодавець зобов'язаний створити в кожному структурному підрозділі
й на робочому місці умови праці відповідно до вимог нормативних актів, а
також забезпечити дотримання прав працівників, гарантованих чинним
законодавством.
З цією метою роботодавець забезпечує функціонування системи
управління охороною здоров'я, для чого створює на підприємстві підрозділи,
які традиційно іменуються службою охорони праці. Ця служба діє на підставі
типового положення, що затверджується спеціально уповноваженим
центральним органом виконавчої влади з питань нагляду за охороною праці та
Закону України "Про охорону праці". Служба охорони праці створюється на
підприємстві виробничої сфери з числом працюючих 50 і більше осіб.
На підприємстві з кількістю працюючих 50 і більше осіб роботодавець
створює службу охорони праці відповідно до типового положення, що
затверджується спеціально уповноваженим центральним органом виконавчої
влади з питань нагляду за охороною праці.
На підприємстві з кількістю працюючих менше 50 осіб функції служби
охорони праці можуть виконувати в порядку сумісництва особи, які мають
відповідну підготовку.
66

На підприємстві з кількістю працюючих менше 20 осіб для виконання


функцій служби охорони праці можуть залучатися сторонні спеціалісти на
договірних засадах, які мають відповідну підготовку.
Служба охорони праці підпорядковується безпосередньо роботодавцю. Служба
охорони праці виконує такі основні функції: опрацьовує ефективну цілісну
систему управління охороною праці від шкідливих впливів, сприяє
удосконаленню діяльності в цьому напрямі кожного структурного підрозділу і
кожної посадової особи; проводить оперативно-методичне керівництво
роботою з охорони праці; складає разом зі структурними підрозділами
підприємства план комплексних заходів щодо досягнення встановлених
нормативів безпеки, гігієни праці та виробничого середовища (підвищення
існуючого рівня охорони праці, якщо встановлених норм досягнуто), а також
розділ "Охорона праці" в колективному договорі проводить для працівників
вступний інструктаж з питань охорони праці; організує: забезпечення
працюючих правилами, стандартами, нормами, положеннями, інструкціями та
іншими нормативними актами з охорони праці; облік, аналіз нещасних
випадків, професійних захворювань і аварій, а також шкоди від цих подій;
розробку перспективних та поточних планів роботи підприємства щодо
створення безпечних та нешкідливих умов праці; бере участь: у розслідуванні
нещасних випадків та аварій; у формуванні фонду охорони праці підприємства і
розподілі його коштів; у розробці положень, інструкцій, інших нормативних
актів про охорону праці, що діють у межах підприємства; контролює:
дотримання чинного законодавства, міжгалузевих, галузевих та інших
нормативних актів, виконання працівниками посадових інструкцій з питань
охорони праці; виконання приписів органів державного нагляду, пропозицій та
подань уповноважених трудових колективів і профспілок з питань охорони
праці, використання за призначенням коштів фонду охорони праці; своєчасне
проведення навчання та інструктажів працюючих, атестації та переатестації з
67

питань безпеки праці посадових осіб та осіб, які виконують роботи підвищеної
небезпеки, а також дотримання вимог безпеки при виконанні цих робіт тощо.

5.4 Заходи з ергономіки

Загальні ергономічні вимоги встановлено ГОСТом 12.2.049-80


"Обладнання виробниче. Загальні виробничі вимоги".
Робоче місце - це місце постійного або тимчасового перебування
працівника під час виконання ним трудових обов’язків.
Ергономічні вимоги при плануванні робочого місця мають забезпечувати
найкраще розміщення предметів і засобів праці, сприяти усуненню загального
дискомфорту, зменшувати втому працюючих та підвищувати їх ефективність і
продуктивність праці.
Площа робочого місця має відповідати опосередкованим
антропометричним характеристикам людини, бути такою, щоб працівник не
робив зайвих рухів і не відчував незручностей в процесі трудової діяльності.
При плануванні робочих місць важливим є те, щоб працюючі могли
природним шляхом змінювати робочу позу корпусу тіла, рук, ніг і мали
можливість уникати неприродного і незручного положення тіла.
Проектування робочих місць з ергономічної точки зору має включати
гігієнічні, антропометричні, фізіологічні та психофізіологічні вимоги в системі
"ЛМС".
Ці вимоги визначають:
– гігієнічні умови життєдіяльності і працездатності людини у процесі її
взаємодії з технікою і виробничим середовищем залежно від рівня освітлення,
температури, вологості, шуму, вібрації, запиленості, загазованості і т. ін.;
– антропометричну відповідності конструкції технічних систем
антропометричним характеристикам людини (зріст, розміри тіла та окремих
68

рухових ділянок). Показниками є раціональна поза, оптимальні зони


досягнення, раціональні трудові рухи;
фізіологічну та психологічну відповідність техніки і середовища можливостям
працівника щодо сприймання, переробки інформації, прийняття і реалізації
рішень.
69

ВИСНОВКИ

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


«Електронна читальна зала». Згідно до вимог розробки, були вибрані система
керуванням базами даних MySQL та мова програмування C#, що дозволили
реалізувати базу даних і забезпечити дружній інтерфейс програми.
В результаті розробки кваліфікаційної роботи можна зробити певні
висновки, які наведені нижче.
При розробці програмного додатку був пройдений повний цикл розробки
програми від постановки завдання до завершення реалізації програми.
Розроблений програмний додаток «Електронна читальна зала» дозволяє:
 вести облік книг;
 вести облік користувачів;
 має доступ до бази в локальній мережі;
 читати книги;
 зберігати книги різних форматів(txt,fb2).
Розроблений програмний продукт має інтуїтивно-зрозумілий графічний
інтерфейс і користувач не потребує спеціальних знань для роботи з ним.
Таким чином, підводячи підсумки кваліфікаційної роботи, слід зазначити,
що в ньому були виконані всі поставлені задачі та досягнута мета роботи.
70

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ


1. Васильев, А. Н. C#. Объектно-ориентированное программирование
[Текст] : учеб. пособие / А. Н. Васильев – П.: Питер, 2012 - 320 с.
2. Дейтел, П. Как программировать на Visual C# 2012. 5-е изд. [Текст] / П.
Дейтел, Х. Дейтел– П.: СПб, 2014. - 846 с.
3. Стиллмен, Э. Head First. Изучаем C#. 3-е изд. [Текст] : учеб. пособие / Э.
Стиллмен, Д. Грин – П.: Питер, 2016. – 816 с.
4. Зиборов, В. В. Visual С# 2012 на примерах [Текст] / В. В. Зиборов–
М.: БХВ-Петербург, 2013. - 475 с.
5. Форта, Бен Освой самостоятельно SQL [Текст] / Бен Форта –
М: Вильямс, 2005. – 287 с.
6. Кузнецов, М. MySQL 5 [Текст] / М. Кузнецов, И. Симдянов – К.: БХВ-
Петербург, 2010. – 1007 с.
7. Гончарук, В. Є. Оцінка обстановки у надзвичайних ситуаціях [Текст]:
навчальний посібник / В. Є. Гончарук, С. І. Качан, С. М. Орел – Л.:
Львівська політехніка, 2004. – 136 с.
8. Русаловський, А.В. Цивільний захист [Текст] : Навч. Посібн. /
А.В. Русаловський, В.Н. Вендичанський ; за наук.ред. Запорожця О.І. –
К.: АМУ, 2008. – 250 с.
9. Пахомов, Б. И. С# для начинающих [Текст] / Б. И. Пахомов - Изд. БХВ-
Петербург, 2014. – 432 с. – ISBN 978-5-9775-0943-5.
71

ДОДАТОК
Лістинг програми
Лістинг 1 – Форма авторизації

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql;
using MySql.Data.MySqlClient;

namespace KURSACH_III
{
public partial class Log_in : Form
{
bool NoExit = false;

public Log_in()
{
InitializeComponent();

Login.Text = KURSACH_III.Properties.Settings.Default.User_Name;
Password.Text = KURSACH_III.Properties.Settings.Default.User_Password;

try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection myConnection = new MySqlConnection(Connect);

myConnection.Open();
ServerConnection.Enabled = true;
ServerConnection.Checked = true;
ServerConnection.Enabled = false;
myConnection.Close();
}
catch
{
ServerConnection.Enabled = true;
ServerConnection.Checked = false;
ServerConnection.Enabled = false;
}

}
72

private void button1_Click(object sender, EventArgs e)


{
SettingsForm f = new SettingsForm();
f.ShowDialog();
}

private void Come_In_Click_1(object sender, EventArgs e)


{
//Логин и пароль пользователя
if (!String.IsNullOrWhiteSpace(Login.Text) && !
String.IsNullOrWhiteSpace(Password.Text))
{

int user_right = 0;
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();

MyCommand.CommandText = "SELECT * FROM users WHERE Login ='" +


Login.Text + "'AND Password ='" + Password.Text + "'";
MyCommand.Connection = MyConnection;

MyConnection.Open();
try
{
MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
KURSACH_III.Properties.Settings.Default.User_Name =
Login.Text;
KURSACH_III.Properties.Settings.Default.User_Password =
Password.Text;
KURSACH_III.Properties.Settings.Default.User_Log_ID =
Reader.GetFieldValue<int>(0);
KURSACH_III.Properties.Settings.Default.Save();
user_right = Reader.GetFieldValue<int>(4);
}
else
{
label1.Visible = true;
return;
}
Reader.Close();
MyConnection.Close();
try
{

MyCommand.CommandText = "SELECT * FROM user_right WHERE


ID_Right ='" + user_right + "'";
MyCommand.Connection = MyConnection;
MyConnection.Open();
73

MySqlDataReader Reader1 = MyCommand.ExecuteReader();

if (Reader1.Read())
{
KURSACH_III.Properties.Settings.Default.User_Rights =
Reader1.GetFieldValue<string>(1);
KURSACH_III.Properties.Settings.Default.Add =
Convert.ToBoolean(Reader1.GetFieldValue<int>(2));
KURSACH_III.Properties.Settings.Default.Delete =
Convert.ToBoolean(Reader1.GetFieldValue<int>(3));
KURSACH_III.Properties.Settings.Default.Edit =
Convert.ToBoolean(Reader1.GetFieldValue<int>(4));
KURSACH_III.Properties.Settings.Default.UserControl =
Convert.ToBoolean(Reader1.GetFieldValue<int>(5));
KURSACH_III.Properties.Settings.Default.Save();
}
Reader1.Close();
MyConnection.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

MyCommand.CommandText = "INSERT INTO user_activity (ID_Users,


ID_Action, User_Name, Action_Name, Date_Activity) VALUES (@ID_Users, @ID_Action,
@User_Name, @Action_Name, @Date_Activity)";
MyCommand.Connection = MyConnection;

MyConnection.Open();

MySqlParameter Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Users";
Parameter.Value =
KURSACH_III.Properties.Settings.Default.User_Log_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Action";
Parameter.Value = 1;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@User_Name";
Parameter.Value =
KURSACH_III.Properties.Settings.Default.User_Name;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Action_Name";
Parameter.Value = "Авторизация";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

DateTime Date = DateTime.Now;


Parameter = new MySqlParameter();
74

Parameter.ParameterName = "@Date_Activity";
Parameter.Value = Date;
Parameter.MySqlDbType = MySqlDbType.DateTime;
MyCommand.Parameters.Add(Parameter);

MyCommand.ExecuteNonQuery();
MyConnection.Close();

label1.Visible = false;
NoExit = true;
Hide();
MainMenu f = new MainMenu();
f.ShowDialog();

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}
catch (Exception)
{
MessageBox.Show(" Нет подключения к базе
данных.\r Измените настройки или проверьте работу сервера.");
}
}
else
{
MessageBox.Show("Заполните все поля");
}

private void Log_in_FormClosed(object sender, FormClosedEventArgs e)


{
if (NoExit == false)
{
DialogResult df = MessageBox.Show("Вы действительно хотите выйти?",
"Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (df == DialogResult.Yes)
{
Application.Exit();
}
}
}
}
}

Лістинг 2 – Форма списку книг

using System;
75

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.Common;
using MySql;
using MySql.Data.MySqlClient;

namespace KURSACH_III
{
public partial class Book_Settings : Form
{
public int ID;
public bool Exit = true;

public Book_Settings()
{
InitializeComponent();
Add_Book.Enabled = true;
Edit_Book.Enabled = true;
Delete_Book.Enabled = true;

if (KURSACH_III.Properties.Settings.Default.Add == false)
{
Add_Book.Enabled = false;
}
if (KURSACH_III.Properties.Settings.Default.Edit == false)
{
Edit_Book.Enabled = false;
}
if (KURSACH_III.Properties.Settings.Default.Delete == false)
{
Delete_Book.Enabled = false;
}
76

private void Load_reload(object sender, EventArgs e)


{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;
MyConnection.Open();

DataSet setdata = new DataSet();


MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT *
FROM books", MyConnection);
dataAdapter.Fill(setdata, "books");
dataGridView1.DataSource = setdata.Tables["books"];

MyConnection.Close();
}
catch
{
MainMenu f = new MainMenu();
Exit = false;
Hide();
f.ShowDialog();
MessageBox.Show("Нет подключения к базе данных.", " Eror",
MessageBoxButtons.OK, MessageBoxIcon.Error);

}
}

private void Book_Settings_Load(object sender, EventArgs e)


77

{
Load_reload(sender, e);
Collection_List();

private void Collection_List()


{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MyConnection.Open();
MySqlCommand MyCommand = new MySqlCommand();
MyCommand.CommandText = "SELECT Genre FROM genre";
MyCommand.Connection = MyConnection;

MySqlDataReader Reader3 = MyCommand.ExecuteReader();


AddBookGenre.Items.Clear();
while (Reader3.Read())
{
AddBookGenre.Items.Add(Reader3.GetString(0));

}
Reader3.Close();

MyConnection.Close();

MyCommand.CommandText = "SELECT Name FROM author";


MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlDataReader Reader4 = MyCommand.ExecuteReader();


AuthorList.Items.Clear();
while (Reader4.Read())
{
78

AuthorList.Items.Add(Reader4.GetString(0));

}
Reader4.Close();

MyConnection.Close();
}

private void Reload_Click(object sender, EventArgs e)


{
Load_reload(sender, e);
}

private void Close_Click(object sender, EventArgs e)


{
MainMenu f = new MainMenu();
Exit = false;
Hide();
f.ShowDialog();

private void ID_Identify(string table, string name, string id_name,


string name_column)
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "SELECT " + id_name + " FROM " + table + "


WHERE " + name_column + " ='" + name + "'";
MyConnection.Open();
MySqlDataReader Reader = MyCommand.ExecuteReader();
79

if (Reader.Read())
{
ID = Reader.GetFieldValue<int>(0);
}
Reader.Close();
MyConnection.Close();

private void Selection_Click(object sender, EventArgs e)


{
try
{

string Connect = "server=" +


KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

string Filtrs = "";

if (!
String.IsNullOrWhiteSpace(AddBookDate.Value.ToShortDateString()) || !
String.IsNullOrWhiteSpace(BookName.Text) || !
String.IsNullOrWhiteSpace(AddBookGenre.SelectedItem.ToString()) || !
String.IsNullOrWhiteSpace(AuthorList.SelectedItem.ToString()))
{
Filtrs = "WHERE ";
if (!
String.IsNullOrWhiteSpace(AddBookDate.Value.ToShortDateString()) && AddBookDate.Value !
= AddBookDate.MinDate)
80

{
if (!(Filtrs == "WHERE ")) { Filtrs = Filtrs + " AND "; }
Filtrs = Filtrs + "Date_Print = '" +
AddBookDate.Value.Year + "." + AddBookDate.Value.Month + "." + AddBookDate.Value.Day +
"'";
}
if (!String.IsNullOrWhiteSpace(BookName.Text))
{
if (!(Filtrs == "WHERE ")) { Filtrs = Filtrs + " AND "; }
Filtrs = Filtrs + "Name = '" + BookName.Text + "'";
}
if (!(AddBookGenre.SelectedItem == null))
{
if (!(Filtrs == "WHERE ")) { Filtrs = Filtrs + " AND "; }
ID_Identify("genre",
AddBookGenre.SelectedItem.ToString(), "ID_Genre", "Genre");
Filtrs = Filtrs + "Genre = '" + Convert.ToString(ID) +
"'";
}
if (!(AuthorList.SelectedItem == null))
{
if (!(Filtrs == "WHERE ")) { Filtrs = Filtrs + " AND "; }
ID_Identify("author", AuthorList.SelectedItem.ToString(),
"ID_Author", "Name");
Filtrs = Filtrs + "Author = '" + Convert.ToString(ID) +
"'";
}
}
MyConnection.Open();

DataSet setdata = new DataSet();


MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT *
FROM books " + Filtrs + "", MyConnection);
dataAdapter.Fill(setdata, "books");
dataGridView1.DataSource = setdata.Tables["books"];
MyConnection.Close();
}
catch
{
81

MessageBox.Show("Нет подключения к базе данных.", " Eror",


MessageBoxButtons.OK, MessageBoxIcon.Error);

}
}

private void Delete_Book_Click(object sender, EventArgs e)


{
string BookID;
string Book_Name;
BookID = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
Book_Name = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();

MyCommand.CommandText = "DELETE FROM books WHERE ID_Book ='" + BookID


+ "'";
MyCommand.Connection = MyConnection;
MyConnection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();

MyCommand.CommandText = "INSERT INTO user_activity (ID_Users,


ID_Action, ID_Tables, User_Name, Action_Name, Tables_Name, Value, Date_Activity) VALUE
(@ID_Users, @ID_Action, @ID_Tables, @User_Name, @Action_Name, @Tables_Name, @Value,
@Date_Activity)";
MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlParameter Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Users";
Parameter.Value =
KURSACH_III.Properties.Settings.Default.User_Log_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
82

MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Action";
Parameter.Value = 4;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Tables";
Parameter.Value = 2;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@User_Name";
Parameter.Value = KURSACH_III.Properties.Settings.Default.User_Name;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Action_Name";
Parameter.Value = "Удаление";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Tables_Name";
Parameter.Value = "Книги";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Value";
Parameter.Value = Book_Name;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

DateTime Date = DateTime.Now;


Parameter = new MySqlParameter();
83

Parameter.ParameterName = "@Date_Activity";
Parameter.Value = Date;
Parameter.MySqlDbType = MySqlDbType.DateTime;
MyCommand.Parameters.Add(Parameter);

MyCommand.ExecuteNonQuery();
MyConnection.Close();

Load_reload(sender, e);
}

private void Edit_Book_Click(object sender, EventArgs e)


{
KURSACH_III.Properties.Settings.Default.Change_Book_ID =
Convert.ToInt32(this.dataGridView1.CurrentRow.Cells[0].Value);
Book_Edit f = new Book_Edit();
Exit = false;
Hide();
f.ShowDialog();
}

private void Add_Book_Click(object sender, EventArgs e)


{
Book_Add f = new Book_Add();
Exit = false;
Hide();
f.ShowDialog();
}

private void dataGridView1_CellClick(object sender,


DataGridViewCellEventArgs e)
{
string BookID;
BookID = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();

try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
84

KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();

MyCommand.CommandText = "SELECT Comment FROM books WHERE ID_Book


='" + BookID + "'";
MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
Comment.Text = Reader.GetFieldValue<string>(0);

}
Reader.Close();
MyConnection.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void OpenBook_Click(object sender, EventArgs e)


{
string BookID =
this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
Reader f = new Reader(Convert.ToInt32(BookID));
Exit = false;
Hide();
f.ShowDialog();

private void Book_Settings_FormClosed(object sender, FormClosedEventArgs


e)
85

{
if (Exit)
{
DialogResult df = MessageBox.Show("Вы действительно хотите
выйти?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (df == DialogResult.Yes) { Application.Exit(); }
}
}
}
}

Лістинг 3 – Форма читання книги

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql;
using MySql.Data.MySqlClient;
using System.IO;
using System.Collections;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Linq;
using System.Text.RegularExpressions;

namespace KURSACH_III
{
public partial class Reader : Form
{
public bool Exit = true;
public int Book_ID;
public string Book_Name = "";
86

public string Book_File_Pass = "";


public string Book_Format = "";
public int Book_Chapter = 0;
public int MaxPage = 0;
public List<XNode> Nodes = new List<XNode>();

public void Format_Idetigication(int Book_Format_ID)


{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "SELECT Format FROM format WHERE ID_Format


='" + Book_Format_ID + "'";
MyConnection.Open();
MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
Book_Format = Reader.GetFieldValue<string>(0);
}
Reader.Close();
MyConnection.Close();
}

public Reader(int Book = 0)


{
Book_ID = Book;
InitializeComponent();

try
{
int Book_Format_ID = 0;
87

string Connect = "server=" +


KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;
MySqlConnection MyConnection = new MySqlConnection(Connect);
MySqlCommand MyCommand = new MySqlCommand();

MyCommand.CommandText = "SELECT * FROM books WHERE ID_Book ='" +


Book_ID + "'";
MyCommand.Connection = MyConnection;
MyConnection.Open();

MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
Book_Name = Reader.GetFieldValue<string>(1);
Book_Format_ID = Reader.GetFieldValue<int>(6);
Book_File_Pass = Reader.GetString(7);
}
Reader.Close();
MyConnection.Close();
this.Text = Book_Name;

try
{
Format_Idetigication(Book_Format_ID);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

if (Book_Format == ".fb2")
{
FB2_Reader();
88

}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

private void WasRead()


{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "SELECT Chapter FROM user_activity WHERE


ID_Users ='" + KURSACH_III.Properties.Settings.Default.User_Log_ID +
"' AND ID_Action = 6 AND Value ='" + Book_Name + "' AND
Date_Activity = (SELECT MAX(Date_Activity) FROM user_activity WHERE ID_Users ='" +
KURSACH_III.Properties.Settings.Default.User_Log_ID +
"' AND ID_Action = 6 AND Value ='" + Book_Name + "')";
MyConnection.Open();

MySqlDataReader Reader = MyCommand.ExecuteReader();

if (Reader.Read())
{
Book_Chapter = Reader.GetFieldValue<int>(0);
}
}

private void FB2_Reader()


{
89

Book_File_Pass = Regex.Unescape(Book_File_Pass.Replace("\\", "/"));


XDocument doc = XDocument.Load(Book_File_Pass);
var namespaceManager = new XmlNamespaceManager(new NameTable());
XNamespace ns = "http://www.gribuser.ru/xml/fictionbook/2.0";
var body = doc.Root.Elements(ns + "body").ToArray();
XDocument doc2 = XDocument.Parse(body[0].ToString());
var SectionArray = doc2.Root.Elements(ns + "section").ToList();
Nodes = SectionArray[0].Nodes().ToList();
MaxPage = Nodes.LastIndexOf(SectionArray[0].LastNode);

WasRead();

Chapter_Out(Book_Chapter);

private void Chapter_Out(int Chapter = 0)


{
XText Chapter_Text = new
XText(((System.Xml.Linq.XElement)Nodes[Chapter]).ToString());
string newChapter = Chapter_Text.Value.ToString();
while (true)
{
var lb = newChapter.IndexOf('<');
var rb = newChapter.IndexOf('>');
if ((rb < 0) || (lb < 0)) break;
newChapter = newChapter.Remove(lb, rb - lb+ 1);
}
Book_Text.Text = newChapter;
}

private void Reader_FormClosed(object sender, FormClosedEventArgs e)


{
if (Exit)
{
DialogResult df = MessageBox.Show("Вы действительно хотите
выйти?", "Выход", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (df == DialogResult.Yes) { Application.Exit(); } else {
Reader f = new Reader();
90

Exit = false; this.Hide(); f.ShowDialog();


}
}
}

private void Close_Book_Click(object sender, EventArgs e)


{
UserActivity();
Book_Settings f = new Book_Settings();
Exit = false;
Hide();
f.ShowDialog();
}

private void UserActivity()


{
try
{
string Connect = "server=" +
KURSACH_III.Properties.Settings.Default.Data_Base_IP + ";database=" +
KURSACH_III.Properties.Settings.Default.Data_Base_Name + ";port=" +
KURSACH_III.Properties.Settings.Default.Port + ";user=" +
KURSACH_III.Properties.Settings.Default.Server_Log + ";password= " +
KURSACH_III.Properties.Settings.Default.Server_Password;

MySqlConnection MyConnection = new MySqlConnection(Connect);


MySqlCommand MyCommand = new MySqlCommand();
MyCommand.Connection = MyConnection;

MyCommand.CommandText = "INSERT INTO user_activity (ID_Users,


ID_Action, ID_Tables, User_Name, Action_Name, Tables_Name, Value, Date_Activity,
Chapter) VALUE (@ID_Users, @ID_Action, @ID_Tables, @User_Name, @Action_Name,
@Tables_Name, @Value, @Date_Activity, @Chapter)";
MyConnection.Open();

MySqlParameter Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Users";
Parameter.Value =
KURSACH_III.Properties.Settings.Default.User_Log_ID;
Parameter.MySqlDbType = MySqlDbType.VarChar;
91

MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Action";
Parameter.Value = 6;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@ID_Tables";
Parameter.Value = 2;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@User_Name";
Parameter.Value =
KURSACH_III.Properties.Settings.Default.User_Name;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Action_Name";
Parameter.Value = "Чтение";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Tables_Name";
Parameter.Value = "Книги";
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Value";
Parameter.Value = Book_Name;
Parameter.MySqlDbType = MySqlDbType.VarChar;
MyCommand.Parameters.Add(Parameter);

DateTime Date = DateTime.Now;


92

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Date_Activity";
Parameter.Value = Date;
Parameter.MySqlDbType = MySqlDbType.DateTime;
MyCommand.Parameters.Add(Parameter);

Parameter = new MySqlParameter();


Parameter.ParameterName = "@Chapter";
Parameter.Value = Book_Chapter;
Parameter.MySqlDbType = MySqlDbType.Int32;
MyCommand.Parameters.Add(Parameter);

MyCommand.ExecuteNonQuery();
MyConnection.Close();
}
catch(Exception ex)
{ MessageBox.Show(ex.Message); }
}

private void Undo_Page_Click(object sender, EventArgs e)


{
if (!(Book_Chapter == 0))
{
Book_Chapter = Book_Chapter - 1;
Chapter_Out(Book_Chapter);
}
}

private void Next_Page_Click(object sender, EventArgs e)


{
if (!(Book_Chapter >= MaxPage))
{
Book_Chapter = Book_Chapter + 1;
Chapter_Out(Book_Chapter);
}
}
}
}

You might also like