You are on page 1of 361

Платформи .

NET

Платформа .NET Framework з’явилася в 2002


році. На той час до її складу входив лише один
стек технологій .NET, з підтримкою якого
можна розробити застосунки Windows та веб-
застосунки.
Платформи .NET
На даний момент є три .NET платформи: .NET Framework, Mono та .NET Core.
Кожна платформа включає в себе наступні технології:
•NET Framework (4.8 остання - 18.05.2019)
•Mono (30.06.2004; 6.12 - 30.06.2020)
•NET Core (1.0 - 27.06.2016; 3.1 – 3.12.2019)
•.NET (починаючи з 5.0, 2020, 8.12.2020, продовження .NET Core)
Платформи .NET
На даний момент є
три .NET платформи:
•NET Framework;
•Mono (XAMARIN);
•NET Core.
Платформи .NET
Створення бібліотек, які можна використовувати в будь-яких реалізаціях .NET, в
тому числі .NET Framework, .NET Core і Xamarin стає складним завданням. Потрібно
знати і враховувати, які API доступні, і переконатися, що загальні компоненти
працюють тільки з тими API, які підтримуються у всіх використовуваних реалізаціях
.NET.
Для вирішення цього завдання призначений .NET Standard. По суті він являє собою
специфікацію. У кожній версії .NET Standard визначено певний набір API. Все
реалізації .NET, що відповідають цим версіям, повинні підтримувати всі ці API. Цю
систему можна розглядати як ще один стек .NET технологій, для якого можна
створювати тільки бібліотеки (але не застосунки). Саме цю реалізацію .NET слід
використовувати при створенні бібліотек, які будуть застосовуватися в різних
системах.
Платформи .NET
.NET Standard - це набір базових API (інша їх назва - BCL, бібліотека базових
класів), які повинні підтримувати всі реалізації .NET. Тобто, .NET Standard дозволяє
створити бібліотеки, що підходять для будь-яких запропонованих .NET платформ.
BCL - це набір базових API, що не залежать від платформи .NET. У нього входять
прості типи, файловий введення-виведення, мережеві API, API серіалізації, XML та
інше.
Кожен стек .NET реалізує певну версію .NET Standard. Зазвичай кожна нова версія
реалізації .NET реалізує найостаннішу (на цей момент) версію .NET Standard.
Платформи .NET
.NET Standard - це набір базових API (інша їх назва - BCL, бібліотека базових класів), які
повинні підтримувати всі реалізації .NET. Тобто, .NET Standard дозволяє створити бібліотеки,
що підходять для будь-яких запропонованих .NET платформ.
.NET Standard - це офіційна специфікація .NET API, які доступні в декількох реалізаціях
.NET. Мотивацією .NET Standard було встановлення більшої однорідності системи .NET. 
Однак .NET 5 усуває потребу в .NET Standard у багатьох сценаріях. 
.NET Standard все ще потрібен для бібліотек, які можуть використовуватися багатьма
реалізаціями .NET:
Використовуйте .NET.Standard 2.0 для обміну кодом між .NET Framework та всіма іншими
реалізаціями .NET.
Використовуйте .NET.Standard 2.1для обміну кодом між Mono, Xamarin та .NET Core 3.x.
Платформи .NET
Платформа ОС Open Source Призначення
Створення класичних Windows-
.NET Framework Windows - застосунків та веб-застосунків
ASP.NET.
Створення кросплатформних
.NET Core та Windows, Linux, macOS + консольних застосунків, та веб-
.NET 5 застосунків, хмарних служб ASP.NET
Core.
Створення мобільних застосунків
Xamarin iOS, Android, macOS + для iOS і Android, класичних
застосунків для macOS.
Створення бібліотек, які можна
використовувати в довільних
.NET Standard довільна + реалізаціях .NET, в тому числі .NET
Framework, .NET Core и Xamarin.
Тема 1. Реляційні
бази даних
К .Ф .-М .Н., ДОЦЕНТ КАФ ЕДР И
Т ЕОР ІЇ ТА Т ЕХНОЛ ОГІЇ
ПР ОГРАМУ ВАННЯ
ОМ ЕЛЬЧ УК Л .Л .

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Змістовий модуль 1. Огляд та застосування
ORM (Object-relational mapping)-технологій
Тема 1. Поняття реляційної бази даних
Інформація - це будь-які відомості про подію, процес чи об’єкт незалежно від форми їх
подання (лат. Informatio - роз'яснення, виклад, обізнаність).
Відомості можуть бути невпорядкованими, тоді їх важко аналізувати для прийняття
рішень. Опрацювання таких відомостей дозволяє їх структурувати і отримати так звані
”дані”.
Дані (Data) - це інформація, подана у формі, зручній для зберігання, передачі та
обробки людиною чи технічними засобами.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Змістовий модуль 1. Огляд та застосування
ORM (Object-relational mapping)-технологій
Тема 1. Поняття реляційної бази даних
Предметна область (ПО, Subject Domain) – це досліджувана частина реального світу.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тема 1. Поняття реляційної бази даних
База даних (БД, DB – Database) – це впорядкований
набір логічно взаємопов’язаних даних, призначених
для задоволення інформаційних потреб певної
предметної області.
Доступ до даних БД здійснюється різними програмами
через посередництво систем керування базами даних
(СКБД).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тема 1. Поняття реляційної бази даних
Система керування базами даних (СКБД) — сукупність
мовних і програмних засобів, що забезпечують
керування створенням та використанням баз даних.
(Російська абревіатура: СУБД ”система управления
базой данных”, та англійська: DBMS – “Database
Management System”)
СКБД, розміщена на одному комп’ютері називається
локальною (централізованою) СКБД. СКБД, частини
якої можуть розміщуватися на декількох комп’ютерах
називається розподіленою.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тема 1. Поняття реляційної бази даних

База даних має такі властивості:


• інтегрованість, спрямована на розв'язок загальних
задач;
• модельність (тобто структурованість), що відображає
вибрану ПО;
• взаємопов'язаність даних;
• незалежність опису даних від прикладних програм.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тема 1. Поняття реляційної бази даних
Робота з базами даних обумовила створення нової
інформаційної технології, що ґрунтується на таких двох
принципах:
• інтеграція даних, коли всі дані накопичують і зберігають
централізовано, створюючи динамічно (у реальному
масштабі часу) поновлювану модель предметної області;
• незалежність прикладних програм від даних, тобто
відділення логічної уяви користувачів БД про предметну
область від фізичного подання даних у пам'яті ЕОМ (так
звана логічна та фізична незалежність даних).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Автоматизовані інформаційні системи (АІС)
Швидкий пошук необхідних записів і представлення їх в зручній формі, проведення
необхідних розрахунків, поповнення, видалення і корекцію даних виконують у них
за допомогою ЕОМ. Програми, за допомогою яких працює
користувач, називають прикладними програмами
(ПП, Application Program) або додатками.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тема 1. Поняття реляційної бази даних
Дані в БД можна представляти по-різному, в залежності від методів опису
типів та логічних структур даних в БД, методів маніпуляції даними, методів
опису та підтримки цілісності БД (того, що дані не будуть змінені при
виконанні таких операцій над ними, як то представлення, збереження,
передача, представлення).
Модель даних – це абстрактне, самодостатнє представлення об‘єктів,
операторів та інших елементів, які в сукупності складають абстрактну
машину доступу до даних, з якими взаємодіє користувач. Ці об’єкти
дозволяють моделювати структуру даних, а оператори – поведінку даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД):
Виділяють наступні моделі даних (МД): ієрархічні, мережеві, реляційні,
постреляційні, багатомірні, об’єктно-орієнтовані та об’єктно-реляційні моделі
даних.
Ієрархічна МД – представляє БД у вигляді ієрархічної (деревовидної) структури.
Об’єкти знаходяться у відношенні «нащадок» – «предок». Перші СКБД
використовували ієрархічну модель представлення даних.

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

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД):
Реляційна МД – представляє БД у вигляді таблиць, що надає можливість
використання формального апарата алгебри відношень та реляційного
числення для обробки даних. Реляційна модель передбачає, що кожен
елемент таблиці є одним елементом даних, кожен стовпчик має унікальне
ім’я та містить дані одного типу, відсутність однакових рядків в таблиці,
довільний порядок рядків та
стовпчиків.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД):
NoSQL або постреляційні бази даних - це термін, який об'єднує в собі
нереляційні сховища даних, які не підкоряються звичним правилам
зберігання даних, так званому ACID (атомарность, узгодженість,
ізольованість, надійність). Термін "NoSQL" вперше був використаний в
1998 році для опису реляційної бази даних, що не використовувала
SQL. Проте популярність даний підхід почав набирати лише в 2009 році.
У той час, як традиційні СУБД орієнтуються на вимоги ACID, в NoSQL
СУБД замість ACID може розглядатися набір властивостей BASE (базова
доступність, гнучкий стан, узгодженість).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД):
Основні види NoSQL моделей:
Ключ / Значення. Це найпростіша форма як для організації даних так і для реалізації, але водночас
одна з найшвидших. Такі сховища дозволяють зберігати в пам'яті за певним ключем будь-які дані,
це може бути просто число або текст, а може бути серіалізований об'єкт. Яскравим представником
такої схеми є популярний зараз memcached і менш популярні: Redis, Scalaris, Tokyo Cabinet,
Voldemort.
Документно-орієнтована. Кожен запис зберігається як окремий документ, що має власний набір
полів, який може відрізнятися від документа до документа. Популярні реалізації такої моделі - Lotus
Notes, CouchDB, MongoDB.
Колоночно-орієнтована. Дані зберігаються в шпальтах замість звичного зберігання в рядках. Це
вигідно для різних архівів інформації та каталогів, в яких велика частина обчислень відбувається над
подібними вибірками даних. Представниками цієї моделі є BigTable, HyperTable і HBase, а також
Cassandra.
Графова. Використовують вершини і ребра графа для представлення інформації. Очевидно, що така
модель набагато продуктивніше працює з даними представленими у вигляді графів, наприклад
соціальних графів. Найбільш відомі системи сховища даних такого типу - neo4j, AllegroGraph,
ActiveRDF.

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

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД):
Об’єктно-орієнтована МД – розглядає дані як абстрактні наділені певними
властивостями об’єкти, що використовують методи взаємодії з іншими
об’єктами предметної області.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Моделі даних (МД) та класифікація СКБД
Об’єктно-реляційна МД – реляційна модель МД, яка підтримує деякі
технології об’єктно-орієнтованих моделей.

Відповідно до МД СКБД поділяють на ієрархічні, мережеві, реляційні,


постреляційні, багатовимірні, об’єктно-орієнтовані та об’єктно-
реляційні СКБД. На сьогоднішній день найбільшого розповсюдження
набули реляційні та об’єктно-реляційні СКБД. Прикладами таких СКБД є
Oracle Database, Informix, DB2, PostgreSQL. Спільною для усіх
перерахованих СКБД є реляційна складова.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Кількість СКБД у відповідності до моделі даних, січень
2021 http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Кількість СКБД у відповідності до моделі даних, січень
2020 http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Популярність категорій СКБД у відповідності до моделі
даних, січень 2021 http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Популярність категорій СКБД у відповідності до моделі
даних, січень 2020 http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Перша десятка рейтингу DB-Engines, січень
2019
http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Перша десятка рейтингу DB-Engines, січень
2020
http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Перша десятка рейтингу DB-Engines, січень
2021
http://db-engines.com/en/ranking

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Перша десятка рейтингу DB-Engines

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Реляційні БД
Реляційна моделі даних – це модель в якій дані
організуються у вигляді набора таблиць.

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


Едгаром Коддом в 1970-і роки.

З реляційною алгеброю ви будете ознайомлені в


курсі «Бази даних та інформаційні системи».

Едгар Франк Кодд 


(23 серпня 1923 — 18 квітня 2003)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Первинний ключ
В правильно побудованій реляційній БД в кожній таблиці є один, або
декілька стовпчиків, значення яких в усіх рядках унікальні. Цей
стовпчик (чи стовпчики) називається первинним ключем таблиці. На
практиці, в якості первинного ключа, як правило, слід обирати
ідентифікатори, такі як номер рейсу, номер потягу, тощо.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Зовнішні ключі
Стовпчик однієї таблиці, значення в якому співпадає зі значенням стовпчика,
що є первинним ключем іншої таблиці, називається зовнішнім ключем.
Зовнішній ключ, як і первинний, може являти собою комбінацію декількох
стовпчиків. Зовнішні ключі слугують для зв’язування кількох таблиць. Якщо
таблиця пов’язана з кількома іншими таблицями, то вона може мати
декілька зовнішніх ключів.
Пара «первинний ключ –
зовнішній ключ» задає
відношення предок/нащадок
між таблицями, що їх містять.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL
SQL (Structured Query Language) - це універсальна мова запитів, що
застосовується для створення, модифікації та керування даними в
реляційних базах даних (мова структурованих запитів).
Мовою реляційних, а відповідно і об’єктно-реляційних БД є мова SQL. Ця
мова базується на численні кортежів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL. Стандарти SQL
Стандарти SQL. Одним з найважливіших кроків з визнання SQL на ринку
стала його стандартизація. Перший стандарт SQL-86, прийнятий
інститутом ANSI (American National Standards Institute) та підтриманий ISO
(International Organization for Standardization) з’явився в 1986 році. Після
цього світ побачили наступні стандарти: SQL-89, SQL-92, SQL:1999,
SQL:2003, SQL:2006, SQL:2008.

Детально з мовою SQL ви познайомитеся в курсі «Бази даних та


інформаційні системи»

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Переваги SQL:
1. Наявність міжнародних стандартів.
2. Незалежність від конкретної СУБД. Незважаючи на наявність діалектів і
відмінностей в синтаксисі, в більшості випадків тексти SQL-запитів, що
містять визначення і маніпулювання даними, можуть бути досить легко
перенесені з однієї СКБД в іншу.
3. Підтримка архітектури клієнт-сервер.
4. Поширеність.
5. Швидке навчання.
6. Декларативність. За допомогою SQL програміст описує тільки те, які дані
потрібно витягнути або модифікувати. Яким чином це зробити, вирішує
СУБД безпосередньо при обробці SQL-запиту.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Недоліки SQL:
1. Неповна відповідність реляційної моделі даних (наявність дублікатів,
необов'язковість первинного ключа, можливість упорядкування результатів).
2. Недостатньо продуманий механізм невизначених значень.
3. Складність формулювань і громіздкість.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Структура мови Transact SQL
Незважаючи на наявність стандартів, практично в кожній СКБД
застосовується свій діалект мови. Для Microsoft SQL Server таким діалектом є
мова Transact SQL.
Широко розповсюджені наступні специфікації SQL:

СКБД Спецификація SQL


Microsoft SQL Transact-SQL
Microsoft Jet/Access Jet SQL
MySQL SQL/PSM (SQL/Persistent Stored
Module)
Oracle PL/SQL (Procedural Language/SQL)
IBM DB2 SQL PL (SQL Procedural Language)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Структура мови Transact SQL
Transact-SQL (T-SQL)- процедурне розширення мови SQL, створене
компанією Microsoft (для Microsoft SQL Server) і Sybase (для Sybase ASE).
SQL був розширений наступними додатковими можливостями, такими як:
Керуючі оператори,
Локальні і глобальні змінні,
Різні додаткові функції для обробки рядків, дат, математики, тощо,
Підтримка автентифікації Microsoft Windows.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція 2.
РЕЛЯЦІЙНІ БАЗИ ДАНИХ
SQL
К . Ф. -М . Н . , Д О Ц ЕН Т К АФ ЕД РИ
ТЕ О РІЇ ТА ТЕХ Н ОЛ О ГІЇ П Р О ГРА М УВА Н Н Я
О М ЕЛ ЬЧ У К Л . Л .

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Реляційні БД
Реляційна моделі даних – це модель в якій дані
організуються у вигляді набора таблиць.

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


Едгаром Коддом в 1970-і роки.

З реляційною алгеброю ви будете ознайомлені в


курсі «Бази даних та інформаційні системи».

Едгар Франк Кодд 


(23 серпня 1923 — 18 квітня 2003)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Реляція (таблиця) позначається, як R(A1,...An), де R - ім'я реляції. A1,...An -
імена атрибутів (полів). Вони мають бути унікальними в межах однієї реляції. Порядок
атрибутів несуттєвий, через унікальність імен.
Приклад: КНИГА(ІД, НАЗВА, ОПИС).
Інші терміни
Кортеж - рядок, запис.
Атрибут - стовпчик, поле.
Степінь - кількість стовпців.
Кардинальність - кількість рядків.
Первинний ключ - ідентифікатор запису.
Домен - область допустимих значень. Тип даних.
Над цією структурою даних існує реляційна алгебра.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук
48 Л.Л.
Атрибути A і B називають  порівнюваними, якщо до будь-якої пари значень з доменів
цих атрибутів можна застосувати предикат порівняння.
Набори атрибутів L та M називають порівнюваними, якщо можна встановити таку
бієкцію між атрибутами, що кожна пара буде порівнювана.
Для зручності вважатимемо, що зіставлені атрибути порівнюваних відношень
повинні мати однакові імена.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
 
Над реляційною структурою даних будується реляційна алгебра. Її елементами
є реляції (таблиці).
Сигнатура реляційної алгебри містить наступні операції: об’єднання, перетин,
різниця, вибірка (обмеження), проекція, декартовий добуток, з’єднання, ділення,
перейменування. Результатами виконання цих операцій є реляції (замкненість
реляційної алгебри).
R = f((, , …), (, , …), …)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Декартів добуток. Відношення (A1, A2, …, Am, B1,
B2, …, Bm), яке є зціпленням відношень A(A1, A2,
…, Am) и B(B1, B2, …, Bm) :
(a1, a2, …, am, b1, b2, …, bm) таких, що
(a1, a2, …, am)∈ A,(b1, b2, …, bm)∈ B.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
 
Вибірка (обмеження). Узагальнена вибірка це унарний оператор, що записується як ,
де φ  є формулою числення висловлювань, що складається із атомів, дозволених
у звичайній вибірці та логічних операторів  (кон’юнкції),  (диз’юнкції) та  (заперечення).
Така вибірка вибирає всі кортежі  для яких значення φ  істина.
Проекція. Проекція — це унарна операція , де   є множиною назв атрибутів. Результат
проекції визначається, як множина, що отримується із всіх кортежів із R, що
обмежуються {  }.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
 
Переіменування. Перейменування є унарним оператором  . Результат
застосування оператора ідентичний  за винятком того, що поле  в усіх
кортежах перейменовується на поле.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
 
Об’єднання. Відношення з тим же заголовком, що і у сумісних за типом
відношень A та B, та тілом, що складається з кортежів, що належать A чи B, чи обом
відношенням: AUB.
Перетин. Відношення з тим же заголовком, що і у сумісних за типом
відношень A та B, та тілом, що складається з кортежів, що належать A та B: AB.
Різниця. Відношення з тим же заголовком, що і у сумісних за типом
відношень A та B, та тілом, що складається з кортежів, що належать A та B не
належать B: AB.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук


54 Л.Л.
З’єднання. Pезультат послідовного застосування операцій декартового добутку та
вибірки. Якщо в відношеннях є атрибути з одинаковими наіменуваннями, то перед
виконанням з’єднання їх необхідно переіменувати.
Ділення. Відношення з заголовком (X1, X2, …, Xn) та тілом, що містить множину
кортежів (x1, x2, …, xn), таких, що для усіх кортежів (y1, y2, …, ym) ∈ B у відношенні A(X1,
X2, …, Xn, Y1, Y2, …, Ym) знайдеться кортеж (x1, x2, …, xn, y1, y2, …, ym).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
У кожної таблиці є унікальне ім’я.
В кожній таблиці є один, або більше стовпчиків, кожен з яких має визначений тип та
своє унікальне (в межах таблиці) ім’я.
В кожній таблиці є нуль, або більше рядків, кожен з яких містить одне значення даних
в кожному стовпчику, при чому це значення має тип свого рядка.
Рядки в таблиці не впорядковані.
Відношення між таблицями реалізуються за
допомогою первинних та
зовнішніх ключів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Первинний ключ
В правильно побудованій реляційній БД в кожній таблиці є один, або
декілька стовпчиків, значення яких в усіх рядках унікальні. Цей
стовпчик (чи стовпчики) називається первинним ключем таблиці. На
практиці, в якості первинного ключа, як правило, слід обирати
ідентифікатори, такі як номер рейсу, номер потягу, тощо.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Зовнішні ключі
Стовпчик однієї таблиці, значення в якому співпадає зі значенням стовпчика,
що є первинним ключем іншої таблиці, називається зовнішнім ключем.
Зовнішній ключ, як і первинний, може являти собою комбінацію декількох
стовпчиків. Зовнішні ключі слугують для зв’язування кількох таблиць. Якщо
таблиця пов’язана з кількома іншими таблицями, то вона може мати
декілька зовнішніх ключів.
Пара «первинний ключ –
зовнішній ключ» задає
відношення предок/нащадок
між таблицями, що їх містять.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL. Стандарти SQL
SQL. Мовою реляційних, а відповідно і об’єктно-реляційних БД є
мова SQL. Ця мова базується на численні кортежів.
SQL (Structured Query Language) - це універсальна мова запитів,
що застосовується для створення, модифікації та керування даними
в реляційних базах даних (мова структурованих запитів).
Стандарти SQL. Одним з найважливіших кроків з визнання SQL
на ринку стала його стандартизація. Перший стандарт SQL-86,
прийнятий інститутом ANSI та підтриманий ISO з’явився в 1986 році.
Після цього світ побачили наступні стандарти: SQL-89, SQL-92,
SQL:1999, SQL:2003, SQL:2006, SQL:2008.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Переваги SQL:
1. Наявність міжнародних стандартів.
2. Незалежність від конкретної СКБД. Незважаючи на наявність діалектів і
відмінностей в синтаксисі, в більшості випадків тексти SQL-запитів, що містять
визначення і маніпулювання даними, можуть бути досить легко перенесені з
однієї СКБД в іншу.
3. Підтримка архітектури клієнт-сервер.
4. Поширеність.
5. Достатньо легкий для вивчення.
6. Декларативність. За допомогою SQL програміст описує тільки те, які дані
потрібно витягнути або модифікувати. Яким чином це зробити, вирішує СКБД
безпосередньо при обробці SQL-запиту.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Недоліки SQL:
1. Неповна відповідність реляційній моделі даних (наявність дублікатів,
необов'язковість первинного ключа, можливість упорядкування
результатів).
2. Недостатньо продуманий механізм невизначених значень.
3. Складність формулювань і громіздкість.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Рівні відповідності
Рівні відповідності. Починаючи з SQL:1999 стандарт має модульну
структуру. Основна частина стандарту внесена в розділ
«SQL/Foundation», всі інші його частини винесені в окремі модулі.
Таким чином, усі СКБД повинні підтримувати основну частину (Core), а
інші частини стандартів підтримуються на розгляд виробника СКБД.
Далі, розглянемо лише можливості SQL/Foundation.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Структура мови Transact SQL
Незважаючи на наявність стандартів, практично в кожній СКБД
застосовується свій діалект мови. Для Microsoft SQL Server таким діалектом є
мова Transact SQL.
Широко розповсюджені наступні специфікації SQL:
СКБД Спецификація SQL
Microsoft SQL Transact-SQL
Microsoft Jet/Access Jet SQL
MySQL SQL/PSM (SQL/Persistent Stored Module)
Oracle PL/SQL (Procedural Language/SQL)
IBM DB2 SQL PL (SQL Procedural Language)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Структура мови Transact SQL
Transact-SQL (T-SQL)- процедурне розширення мови SQL, створене
компанією Microsoft (для Microsoft SQL Server) і Sybase (для Sybase ASE).
SQL був розширений наступними додатковими можливостями, такими як:
Керуючі оператори,
Локальні і глобальні змінні,
Різні додаткові функції для обробки рядків, дат, математичних виразів,
тощо,
Підтримка аутентифікації Microsoft Windows.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Короткий огляд мови SQL на прикладі Transact-SQL

Для часто виконуваних запитів, або як для допомоги в написанні


складних запитів зручно зберігати його як збережений запит, що
складається з результатів цього запиту. Такий запит називається
представленням (View).
Представлення (View) – це збережений запит, доступний як віртуальна
динамічна таблиця, що складається з результатів запиту. Зміна даних в
таблицях БД змінює їх у відповідних представленнях.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Транзакція – це декілька послідовних операторів SQL, які
розглядаються як єдине ціле. В транзакції кожен оператор розв’язує
частину загальної задачі, але для розв’язання усієї задачі, потрібно, щоб
усі ці оператори були виконані. У випадку виникнення проблеми
виникає «відкат» транзакції, тобто не виконується вся послідовність
операторів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Часто, при настанні певних подій в БД (наприклад, додавання чи
оновлення видалення) потрібно виконувати певні процедури. Наприклад,
при видаленні певного товару в магазині, можливо потрібно видалити всі
не виконані замовлення на цей товар. Для таких дій використовуються
тригери.
Тригер – це збережена процедура, використання якої обумовлено
настанням визначеної події у БД, як: додавання, вилучення чи зміна
даних. Тригери застосовуються для забезпечення цілісності даних. Тригер
запускається сервером автоматично при настанні події з якою він
пов’язаний. Всі здійснені ним модифікації даних розглядаються як
виконані в транзакції.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Коментарі

Коментарі використовуються для створення пояснень для блоків


сценаріїв, а також для тимчасового відключення команд при
налагодженні скрипта. Коментарі бувають як рядковими так і
блоковими:
-- — рядковий коментар виключає з виконання тільки один рядок,
перед яким стоять два мінуси.
/* */ — блоковий коментар виключає з виконання цілий блок команд,
укладений в зазначену конструкцію. Допускає вкладені коментарі.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Типи даних
•Числа — bit, int, tinyint, smallint, bigint, numeric, decimal, money,
smallmoney, float, real.
•Дати — datetime, smalldatetime, date, time, datetime2, datetimeoffset.
•Символи — char, nchar, varchar, nvarchar.
•Двійкові — binary, varbinary.
•Більш об'ємні — text, ntext, image.
•Спеціальні — покажчики (cursor), 16-байтове шістнадцяткове число, яке
використовується для GUID (uniqueidentifier), штамп зміни рядка
(timestamp), версія рядки (rowversion), таблиці (table).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Типи даних

•Для використання кирилиці (НЕ ASCII кодування) використовуються типи


даних з приставкою «n» (nchar, nvarchar, ntext), які кодують символи
двома байтами. Інакше кажучи, для роботи з Unicode використовуються
типи даних з «n» (від слова national). Строкові константи з Unicode також
записуються з «n» на початку.
•Для даних змінної довжини використовуються типи даних з приставкою
«var». Типи даних без приставки «var» мають фіксовану довжину області
пам'яті, невикористана частина якої заповнюється пробілами або
нулями.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні типи даних, визначені в стандартах
SQL
CHAR(len) - рядок символів фіксованої довжини
розміром len символів;
VARCHAR(len) - рядок символів змінної довжини з
максимальним розміром до len символів;
INT[(len)] - ціле число довжиною 4 байта, що
представляється при виведенні максимально len
цифрами;
SMALLINT[(len)] - ціле число довжиною 2 байта, що
представляється при виведенні максимально len
цифрами;
FLOAT[(len, dec)] - дійсне число, де len – це максимальна кількість
символів, dec – кількість цифр після десяткової
точки;

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DATE - календарна дата;

TIME - астрономічний час

NUMERIC (len, dec) - дійсне число, де len – це максимальна кількість


(NUMBER(len, dec)) символів, dec – кількість цифр після десяткової
точки;

NUMERIC (len) - ціле число, яке має максимальну довжину len.


(NUMBER(len))

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Рядкові та символьні константи повинні міститися в
одинарних чи подвійних лапках.

УВАГА!!! Назви типів даних в різних СКБД не


завжди співпадають між собою та з рекомендаціями
стандарту SQL.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Вирази в SQL
Вирази в SQL використовуються для виконання операцій над значеннями, прочитаними
з БД чи тими, що використовуються для пошуку в БД. Вирази можуть включати в себе
дужки, арифметичні операції +, -, *, / та деякі функції:
UPPER(рядок) –перетворення рядка до верхнього регістра

LOWER(рядок) – перетворення рядка до нижнього регістра


DAY(дата) – повертає число дати
MONTH(дата) – повертає місяць дати

YEAR(дата) – повертає рік дати


GETDATE() – повертає поточну системну дати
LEN(рядок) – повертає довжину рядка в символах
ROUND(число, – виконує округлення числа з потрібною точністю
точність)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Крім цього, використовуються агрегатні функції, які дозволяють
отримувати різні види статистичної інформації, використовуючи в якості
аргументу деякий стовпчик повністю, а повертаючи одне значення.
COUNT([DISTINCT] – підраховує кількість рядків в групах. Якщо вказати * чи
[*][<вираз>]) довільну константу, крім NULL, то функція буде рахувати
всі рядки в таблиці результатів. Якщо задати вираз, то
рядки, для яких вираз має значення не NULL. Задання
модифікатора DISTINCT надає команду рахувати рядки в
групах після видалення дублюючих рядків.

SUM(<вираз>| – обчислює суму всіх значень, що містяться в стовпчику.


DISTINCT Якщо задати вираз, то обчислюється сума значень
<ім’я_стовпчика>) стовпчика, для яких вираз має значення не NULL. Задання
модифікатора DISTINCT надає команду рахувати суму
значень після видалення дублюючих рядків.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
AVG(<вираз>| – обчислює середнє всіх значень, що містяться в
DISTINCT стовпчику. Якщо задати вираз, то обчислюється
<ім’я_стовпчика>) середнє значень стовпчика, для яких вираз має
значення не NULL. Задання модифікатора DISTINCT
надає команду рахувати середнє після видалення
дублюючих рядків.

MAX(<вираз>) – знаходить найбільше серед усіх значень, що


містяться в стовпчику.
MIN(<вираз>) – знаходить найменше серед усіх значень, що
містяться в стовпчику.

Для складних виразів використовуються дужки.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Нехай маємо просту базу даних бібліотеки:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Деякі оператори SQL
Обробка даних  
SELECT - зчитування даних з БД;
INSERT - додавання нових рядків в БД;
DELETE - видалення рядків з БД;
UPDATE - обновлення даних в БД;
Визначення даних  
CREATE TABLE - створення в БД нової таблиці;
DROP TABLE - видалення таблиці з БД;
ALTER TABLE - зміна структури існуючої таблиці;
CREATE VIEW - додавання в БД нового представлення;
DROP VIEW - видалення представлення з БД;
CREATE INDEX - створення індексу для стовпчика;
DROP INDEX - видалення індексу стовпчика;
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запит на створення таблиці
CREATE TABLE
<create-table> ::= CREATE TABLE <ім’я-таблиці>
(<список-визначень-стовпчиків>)
[<визначення-первинних-ключів>]
[<визначення-зовнішніх-ключів>]
[<умова-унікальності-даних>]
[<умова-перевірки>]

Розглянемо більш детально секції запиту <create-table>

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
<список-визначень-стовпчиків> складається із
визначень стовпчиків через кому.
<визначення-стовпчика> ::= <ім’я-стовпчика> <тип-
даних> [DEFAULT значення]
[DEFAULT значення] – означає значення по замовчуванню, а
[NOT NULL] – означає, що відповідне значення не може бути
не порожнім.
<визначення-первинних-ключів> ::=
PRIMARY KEY(<список-імен-стовпчиків-через-кому>)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
<визначення-зовнішніх-ключів> ::=
[<ім’я-відношення>]
(<список-імен-стовпчиків-через-кому>)
REFERENCE <ім’я-таблиці>
[MATCH
FULL | PARTIAL
]
[ON DELETE
CASCADE | SET NULL | SET DEFAULT | NO ACTION
]
[ON UPDATE
CASCADE | SET NULL | SET DEFAULT | NO ACTION
]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тут, REFERENCE <ім’я-таблиці> задає таблицю-предок з якою відбувається зв’язування.
 
[ON DELETE
CASCADE | SET NULL | SET DEFAULT | NO ACTION
]
та
[ON UPDATE
CASCADE | SET NULL | SET DEFAULT | NO ACTION
] – задають правила поведінки при видаленні чи оновленні даних,
 <умова-унікальності-даних> ::=
UNIQUE(<список-імен-стовпчиків-через-кому>)
<умова-перевірки> ::= CHECK(<умова-пошуку>)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Приклад 1 (MS SQL Server)
CREATE TABLE AUTHORS(
AU_ID int IDENTITY(1,1) NOT NULL,
AU_NAME nvarchar(50) NOT NULL,
AU_INFO ntext NULL,
CONSTRAINT PK_AUTHORS_1 PRIMARY KEY CLUSTERED
(
AU_ID ASC
))

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Приклад 1 (MS SQL Server)

CREATE TABLE DIC_CATEGORIES(


DC_ID int IDENTITY(1,1) NOT NULL,
DC_NAME nvarchar(50) NOT NULL,
DC_INFO text NULL,
CONSTRAINT PK_DIC_CATEGORIES PRIMARY KEY CLUSTERED
(
DC_ID ASC
))

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
CREATE TABLE DIC_STATUSES(
DS_ID int NOT NULL,
DS_NAME nvarchar(20) NOT NULL,
CONSTRAINT PK_DIC_STATUSES PRIMARY KEY CLUSTERED
( DS_ID ASC))
 
 CREATE TABLE READERS(
RD_ID int IDENTITY(1,1) NOT NULL,
RD_NAME nvarchar(50) NOT NULL,
RD_ADDRESS ntext NULL,
RD_INFO ntext NULL,
CONSTRAINT PK_READERS PRIMARY KEY CLUSTERED
( RD_ID ASC ))
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
CREATE TABLE BOOKS(
BK_ID int IDENTITY(1,1) NOT NULL,
BK_NAME nvarchar(50) NOT NULL,
BK_INFO ntext NULL,
BK_DC int NOT NULL,
CONSTRAINT PK_BOOKS PRIMARY KEY CLUSTERED (BK_ID ASC),
CONSTRAINT FK_BOOKS_DIC_CATEGORIES FOREIGN KEY(BK_DC)
REFERENCES DIC_CATEGORIES (DC_ID))

CREATE TABLE AUTHORS_BOOKS(


AB_BK int NOT NULL,
AB_AU int NOT NULL,
CONSTRAINT PK_AUTHORS_BOOKS PRIMARY KEY CLUSTERED
(AB_BK ASC, AB_AU ASC ),
CONSTRAINT FK_AUTHORS_BOOKS_AUTHORS FOREIGN KEY(AB_AU)
REFERENCES AUTHORS (AU_ID),
CONSTRAINT FK_AUTHORS_BOOKS_BOOKS1 FOREIGN KEY(AB_BK)
REFERENCES BOOKS (BK_ID))
 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
CREATE TABLE READERS_BOOKS(
RB_ID int IDENTITY(1,1) NOT NULL,
RB_RD int NOT NULL,
RB_BK int NOT NULL,
RB_ISSUE date NOT NULL,
RB_PLAN_RETURN date NOT NULL,
RB_DS int NOT NULL,
RB_FACT_RETURN date NULL,
CONSTRAINT PK_READERS_BOOKS PRIMARY KEY CLUSTERED
(RB_ID ASC),
 CONSTRAINT FK_READERS_BOOKS_BOOKS1 FOREIGN KEY(RB_BK)
REFERENCES BOOKS (BK_ID),
 CONSTRAINT FK_READERS_BOOKS_DIC_STATUSES FOREIGN KEY(RB_DS) REFERENCES DIC_STATUSES (DS_ID),
 CONSTRAINT FK_READERS_BOOKS_READERS FOREIGN KEY(RB_RD)
REFERENCES READERS (RD_ID))

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук


88 Л.Л.
Створимо зайву таблицю:

CREATE TABLE BOOKS1(


BK1_ID int IDENTITY(1,1) NOT NULL,
BK1_INFO ntext NULL,
CONSTRAINT PK_BOOKS1 PRIMARY KEY CLUSTERED
(BK1_ID ASC))
 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ЗАПИТ НА ЗМІНУ СТРУКТУРИ
ІСНУЮЧОЇ ТАБЛИЦІ
<alter-table> ::= ALTER TABLE <ім’я-таблиці>
ALTER TABLE
ADD <визначення-стовпчика>|
ALTER <ім’я-стовпчика> SET DEFAULT <значення>| DROP DEFAULT | DROP <ім’я-
стовпчика> CASCADE|RESTRICT |
ADD [<визначення-первинних-ключів>]
[<визначення-зовнішніх-ключів>]
[<умова-унікальності-даних>]
[<умова-перевірки>]
| DROP CONSTRAINT <умова> CASCADE|RESTRICT
 Секції аналогічні до секцій запиту на створення таблиці.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Змінимо структуру таблиці BOOKS, додавши до неї новий
стовпчик:
Приклад 2.
 ALTER TABLE BOOKS1
 ADD BK1_NAME nvarchar(50) NOT NULL

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
TABLE
<drop-table> ::= DROP TABLE <ім’я-таблиці> [CASCADE | RESTRICT]
Розглянемо більш детально секції запиту <drop-table>
Якщо задано параметр CASCADE, і в БД існують об’єкти, які містять
посилання на видаляємо таблицю (містять відповідний зовнішній ключ), то
видалення не відбудеться.
Для видалення таблиці BOOKS1 з бази даних бібліотеки створимо
наступний запит.
Приклад 3.
DROP TABLE BOOKS1

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ЗАПИТ НА ДОДАВАННЯ НОВИХ РЯДКІВ
INSERT
<insert> ::= INSERT INTO <ім’я-таблиці> [(<список-стовпчиків>)] VALUES
(<список-значень-для-стовпчиків>)
 
<список-значень-для-стовпчиків> ::= 
<КОНСТАНТА> | <NULL> |
<константа>, <список-значень-для-стовпчиків> |<NULL>, <список-
значень-для-стовпчиків>

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконаємо послідовно наступні запити на додавання нових записів.
INSERT INTO AUTHORS
(AU_ID, AU_NAME, AU_INFO) VALUES (1,'Зубенко В.В.', '')
 
INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES ('Омельчук Л.Л.', '')
 
INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES ('Нікітченко М.С.', '')
 
INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES ('Шкільняк С.С.', '')
 INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES ('Лавріщева К.М.', '')
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
[AUTHORS]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
INSERT INTO DIC_CATEGORIES
(DC_NAME)
VALUES ('Програмування')
 
INSERT INTO DIC_CATEGORIES
(DC_NAME)
VALUES ('Логіка')

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
[DIC_CATEGORIES]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
INSERT INTO BOOKS
(BK_NAME, BK_INFO, BK_DC)
VALUES ('Програмування', 'ІНФОРМАЦІЯ Програмування',1)
 
INSERT INTO BOOKS
(BK_NAME, BK_INFO, BK_DC)
VALUES ('Програмна інженерія', 'ІНФОРМАЦІЯ Програмна інженерія', 1)
 
INSERT INTO BOOKS
(BK_NAME, BK_INFO, BK_DC)
VALUES ('Математична логіка та теорія алгоритмів', 'ІНФОРМАЦІЯ Математична
логіка та теорія алгоритмів', 2)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
[BOOKS]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
INSERT INTO AUTHORS_BOOKS (AB_AU, AB_BK)
VALUES (1, 1)

INSERT INTO AUTHORS_BOOKS (AB_AU, AB_BK)


VALUES (14, 1)

INSERT INTO AUTHORS_BOOKS (AB_AU, AB_BK)


VALUES (15, 2)

INSERT INTO AUTHORS_BOOKS (AB_AU, AB_BK)


VALUES (16, 3)

INSERT INTO AUTHORS_BOOKS (AB_AU, AB_BK)


VALUES (17, 3)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
[AUTHORS_BOOKS]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SELECT
<select> ::= SELECT [ALL | DISTINCT | DISTINCTROW]
<список-повертаємих-стовпчиків> | *
FROM <список-таблиць>
[WHERE <умова-пошуку>]
[GROUP BY <список-стовпчиків>]
[HAVING <умова_пошуку_груп>]
[ORDER BY <список-стовпчиків-для-сортування>]
 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Секція <список-повертаємих-стовпчиків> | *
 
“*” означає, що повернути потрібно всі стовпчики із заданого списка таблиць секції
FROM;
<список-повертаємих-стовпчиків> – перераховує через кому імена стовпчиків, що
містяться в таблицях, які перераховані в секції FROM. Стовпчики в результуючій таблиці
будуть розміщені в порядку перерахування іх в <список-повертаємих-стовпчиків>. У
випадку, якщо стовпчику в результуючій таблиці потрібно присвоїти нове ім’я, то
можна зазначати імена стовпчиків наступним чином: <ім’я-стовпчика> AS <ім’я-
стовпчика-в-результуючій-таблиці>.
Крім того, в якості елементів цього списку можуть бути обчислювані значення
елементів деяких із стовпчиків. Для отримання значення таких стовпчиків потрібно
вказати вираз його обчислення із значень, що зберігаються в БД.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Секція FROM <список-таблиць>
Задає список таблиць, перерахованих через кому, які беруть участь в запиті.
У випадку, якщо в декількох таблицях секції FROM присутнє однакове ім’я
(або за бажанням) можна зазначати імена стовпчиків наступним чином:
<ім’я-таблиці>.<ім’я стовпчика>, тут <ім’я-таблиці> повинно належати
списку секції FROM.
Секція WHERE <умова-пошуку>
Для визначення умови відбору рядків, слід використати секцію WHERE.
Рядок відбирається, якщо результат предиката, заданого в <умова-пошуку>
має результат TRUE.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Розглянемо основні умови пошуку:
<вираз_1> = <вираз_2>
<вираз_1> <> <вираз_2>
<вираз_1> < <вираз_2>
<вираз_1> <= <вираз_2>
<вираз_1> > <вираз_2>
<вираз_1> >= <вираз_2>
Перевірка на належність діапазону значень
<перевіряємий-вираз> [NOT] BETWEEN <нижнє-значення> AND <верхнє-значення>
Перевірка на належність множині
<перевіряємий-вираз> [NOT] IN (<список-констант-через-кому>)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Перевірка на відповідність шаблону
<ім’я-стовпчика> [NOT] LIKE <шаблон> [ESCAPE <символ-пропуску>]
Перевірка на рівність значенню NULL
<ім’я-стовпчика> IS [NOT] NULL

Для побудови складних умов пошуку використовуються дужки та AND, OR та


NOT.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Секція GROUP BY <список-стовпчиків>
Надає команду групувати рядки, що мають спільне значення елементів
зазначених стовпчиків таким чином, щоб функція агрегації могла бути
застосована до кожної групи.
Секція HAVING <умова_пошуку_груп>
Для визначення умови відбору груп рядків, слід використати секцію HAVING.
Відбирається група, яка задовольняє умові. Умова аналогічна умові в секції
WHERE.
Секція HAVING майже завжди використовується разом з секцією GROUP BY.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Секція ORDER BY <список-стовпчиків-для-сортування>
Використання цієї секції дозволяє відсортувати результати запиту. Тут
<список-стовпчиків-для-сортування> з перерахування через кому
<елементів-списку-стовпчиків-для-сортування>.
 
<елемент-списку-стовпчиків-для-сортування> ::=
<ім’я-стовпчика>
[<порядковий-номер стовпчика>] [ASC | DESC]
Тут ASC – сортування в лексико-графічному порядку за зростанням, а DESC –
за спаданням.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Приклад 4.
 Додамо в таблицю авторів послідовно наступні записи:
 INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES (‘Пушкін О.С.', '')
 
INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES (‘Шевченко Т.Г.', '')
 
Тепер знайдемо авторів у яких немає книжок в нашій бібліотеці:
DELETE FROM AUTHORS
WHERE AU_ID NOT IN
(SELECT AB_AU FROM AUTHORS_BOOKS)

ІС ТА ТП 2 КУРС, Ф-Т КОМП'ЮТЕРНИХ НАУК ТА КІБЕРНЕТИКИ ОМЕЛЬЧУК Л. Л.


 
Додамо книгу:
INSERT INTO BOOKS
(BK_NAME, BK_INFO, BK_DC)
VALUES ('Теорія алгоритмів', '', 2)

Та автора цій книзі:


INSERT INTO AUTHORS_BOOKS
(AB_BK, AB_AU)
VALUES (5,4)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Знайдемо всіх авторів та їх кількість книг в бібліотеці, і
відсортуємо список за алфавітом:
 SELECT AU_NAME, COUNT(AB_BK) AS COUNT_BOOKS
FROM AUTHORS, AUTHORS_BOOKS
WHERE
 (AU_ID = AB_AU)
GROUP BY AU_ID, AU_NAME
ORDER BY AU_NAME

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Результат виконання запиту:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
INSERT INTO AUTHORS
(AU_NAME, AU_INFO) VALUES (‘Пушкін О.С.', '')

INSERT INTO AUTHORS


(AU_NAME, AU_INFO) VALUES (‘Шевченко Т.Г.', '')

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Тепер знайдемо авторів у яких немає книжок в
нашій бібліотеці:
SELECT AU_ID, AU_NAME FROM AUTHORS
WHERE AU_ID NOT IN
(
SELECT AB_AU FROM AUTHORS_BOOKS
)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ЗАПИТ НА ВИДАЛЕННЯ РЯДКІВ
DELETE

<delete> ::= DELETE FROM <ім’я-таблиці>


[WHERE <умова-пошуку>]
 
Секція [WHERE <умова-пошуку>] аналогічна до такої секції в
запиті на пошук.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Для його видалення достатньо виконати один з наступних
запитів:
DELETE FROM AUTHORS WHERE ((AU_ID = 20) OR(AU_ID = 21))
 
Або
 
DELETE FROM AUTHORS WHERE ((AU_NAME = 'Пушкін О.С.‘) OR
(AU_NAME = ‘Шевченко Т.Г.’))

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Нехай потрібно видалити авторів, книжок яких в бібліотеці
немає:

DELETE FROM AUTHORS


WHERE AU_ID NOT IN
(SELECT AB_AU FROM AUTHORS_BOOKS)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ЗАПИТ НА ОНОВЛЕННЯ ІСНУЮЧИХ
ДАНИХ UPDATE

<update> ::= UPDATE <ім’я-таблиці>


SET <список-пар-ім’я-поля-та-вираз>
[WHERE <умова-пошуку>]
 
Секція [WHERE <умова-пошуку>] аналогічна до такої секції в запиті на
пошук.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Помістимо в поле DA_INFO таблиці DIC_AUTHOR для авторів книги 1
відповідну інформацію:

 
UPDATE AUTHORS
SET AU_INFO = 'АВТОР КНИГИ Програмування'
WHERE AU_ID IN
(
SELECT AB_AU FROM AUTHORS_BOOKS WHERE AB_BK=1
)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Після виконання цього запиту маємо наступні дані в таблиці AUTHORS:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція 2. Огляд
технологій доступу
до даних
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Робота з даними
Велика кількість застосунків розв’язують задачі читання чи оновлення інформації
в БД.
Як правило, програми, які працюють з даними використовують більшість
процесів, показаних в наступній схемі (цикл даних):

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Технології доступу до даних
Технологією доступу до даних називається система інтерфейсів, що
забезпечує взаємодію між застосунком і базою даних (БД). У багатьох СКБД є
бібліотеки, що містять інтерфейси прикладного програмування (API), що
представляють собою функції, за допомогою яких можна виконувати ті чи інші
дії.
Для того щоб найбільш повно використовувати можливості того чи іншого
сервера баз даних, необхідно працювати безпосередньо через API. Однак, це
означає повну залежність застосунку від того чи іншого сервера і складність
переходу на іншу платформу, так як буде необхідно переписувати велику
кількість коду. Як результат – на сьогодні найбільш вживаними є універсальні
механізми доступу до даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Технології доступу до даних
Універсальні механізми доступу до даних зазвичай реалізовані у вигляді
бібліотек і додаткових модулів (драйверів або провайдерів). Бібліотеки
містять певний стандартний набір класів, методів, параметрів, і
забезпечують стандартний інтерфейс доступу до даних. Додаткові
модулі реалізують безпосереднє звернення до функцій клієнтського API
конкретних СКБД.
Основними недоліками універсальних методів доступу до даних є
зниження продуктивності, необхідність відповідних драйверів і їх
налагодження і т. п. Але не можна забувати і про те, що вони значно
збільшують продуктивність праці програміста, так як відпадає
необхідність у вивченні специфічних інтерфейсів і специфічних засобів
розробки для кожної конкретної СКБД.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Технології доступу до даних
Універсальні технології доступу до даних покликані вирішити проблему
доступу до даних з різних джерел. Вони є прошарком між API
конкретного сервера і застосунком користувача, надаючи програмісту
простий уніфікований механізм роботи з даними. На сьогоднішній день
існує багато технологій доступу до даних, таких як ODBC, OLE, DAO, ADO,
BDE, JDBC, ADO.NET, ADO.NET Core…

Деякі з перерахованих технологій вже є застарілими.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ODBC 
(Open Database Connectivity) — відкритий інтерфейс баз даних. (1990-і)
На початку 1990 років існувало декілька постачальників баз даних, кожен з яких
мав власний інтерфейс. Якщо додатку було необхідно підключатися до кількох
джерел даних, для взаємодії з кожною з баз даних був необхідний
нестандартний код. Для вирішення цієї проблеми Microsoft  у співробітництві з
Simba Technologies на основі специфікацій Call Level Interface (CLI), які
розроблялися організаціями SQL Access Group, X/Open і Microsoft, створили
стандартний інтерфейс для отримання і відправки даних джерелам даних різних
типів. При підключенні за допомогою ODBC застосунок стає незалежним від
використовуваної СКБД. Незалежність реалізується за допомогою додаткових
бібліотек, які включають в себе код, специфічний для даної СКБД, і які надають
уніфікований інтерфейс для ODBC-застосунків. Такі бібліотеки називаються ODBC-
драйверами.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ODBC 
ODBC (Microsoft) - механізм взаємодії з реляційними базами
даних. Для забезпечення доступу до БД необхідні клієнтська
частина СКБД, ODBC-драйвер для доступу до цієї СКБД і
відповідне налаштування ODBC на комп'ютері. Драйвер, при
виконанні програми, завантажується в адресний простір
програми і використовується для доступу до БД. Для кожної
СКБД використовується власний ODBC-драйвер.
ODBC API стандартизований. У візуальних середовищах
розробки тепер досить переміщення на форму відповідної
компоненти, зазначення джерела даних ODBC, імені таблиці і
зв'язок з базою даних встановлено.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ODBC 
Переваги ODBC:
 простота розробки застосунку;
 дозволяє створювати розподілені додатки без врахування
конкретних СКБД, тобто додаток стає незалежним від СКБД.
Недоліки ODBC :
 зниження швидкості доступу до даних та часу обробки запитів, що пов'язано з
необхідністю трансляції запитів та наявністю додаткового програмного прошарку;
 необхідні попередня інсталяція та налаштування ODBC-драйвера на кожному
робочому місці;
 відсутність об'єктно-орієнтованого підходу. Однак, в бібліотеці MFC, яку Microsoft
рекомендує для розробки прикладних програм за допомогою Visual C++, є класи
для роботи з даними через ODBC.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. OLE DB 
(Object Linking and Embedding Data Base) – забезпечує СОМ-застосункам
доступ до даних незалежно від типу джерела даних.
У технології OLE DB використовується механізм провайдерів, під якими
розуміють постачальників даних.
Провайдер являє собою компоненту СОМ, що дозволяє приймати
виклики OLE DB і виконувати все необхідне для обробки запиту до
джерела даних. Провайдер повертає запитуваний
об'єкт - зазвичай це дані в табличному вигляді.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. OLE DB 
OLE DB (Microsoft) - механізм роботи з різноманітними
джерелами даних (на відміну від ODBC - де тільки робота
з реляційними БД) на базі COM-інтерфейсу.
OLE DB визначає набір COM-інтерфейсів (Component
Object Model), що включають різні сервіси однотипного
доступу до різних даних (в тому числі і до нереляційних БД до файлів інших
типів), забезпечуючи при цьому підтримку роботи з наборами даних і
ієрархічними наборами записів, підключеними постійно до мережі. Для
доступу до БД потрібне встановлення OLE DB провайдера для СКБД (DLL СУБД
завантажується при виконанні застосунку в його адресний простір).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. OLE DB 
Ця технологія надає об'єктно-орієнтований інтерфейс для будь-яких мов
програмування, сумісних з COM, а не тільки для Visual C++.

OLE DB може працювати і через ODBC - з'єднання за допомогою


спеціального драйвера, який підключається до ODBC-драйверів. Ця
зв'язка, звичайно, створює зайву ланку в ланцюжку підключень, але в
разі відсутності потрібних OLE DB-драйверів і наявності
таких для ODBC цілком можна скористатися цим
механізмом з'єднання.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. BDE 
(Borland Data Engine).
Дана технологія реалізована у вигляді динамічно підключаємих
бібліотек і має достатньо розвинений інтерфейс прикладних програм
IDAPI (Integrated Database Application Program Interface). Цей інтерфейс
являє собою набір функцій для роботи з базами даних. Призначена
лише для Borland.
Є деяким аналогом ODBC. Як і ODBC технологія BDE має набір драйверів
для роботи з різними СКБД. Якщо власного драйвера для доступу до
деякої СКБД в BDE немає, то використовується драйвер доступу до
ODBC. 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. BDE 
BDE (Borland) - універсальний механізм доступу до даних, що базується на
двох групах бібліотек-драйверів (SQL Links - для серверних СКБД і ODBS
Links - для серверних і автономних СКБД). Ці бібліотеки дозволили
застосовувати стандартний набір функцій для доступу до даних dBase,
Access, FoxPro, ODBC-джерел, а також більшості серверних СКБД. BDE
підтриманий на рівні компонент в візуальних середовищах розробки
фірми Borland. Реалізація механізму дозволяє функціям застосунку
звертатися до функцій клієнтського API або ODBC API, а також
безпосередньо маніпулювати файлами даних деяких СКБД. Для доступу до
бази даних за допомогою BDE на комп'ютері повинні бути встановлені
бібліотеки BDE загального призначення (зазвичай встановлюються разом із
середовищем розробки і потім включаються в .exe файл), а також BDE-
драйвер для даної СУБД.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. JDBC 
JDBC (Java Data Base Connectivity) - прикладний програмний інтерфейс
Java, який визначає методи, за допомогою яких програмне забезпечення
на Java здійснює доступ до бази даних. JDBC — це платформо-
незалежний промисловий стандарт взаємодії Java-додатків з
різними СКБД, реалізований у вигляді пакета java.sql, що входить до
складу Java SE.
В основі JDBC лежить концепція драйверів, що дозволяють отримувати
з'єднання з базою даних за спеціально описаним URL. Драйвери можуть
завантажуватись динамічно (під час роботи програми). Завантажившись,
драйвер сам реєструє себе й викликається автоматично, коли програма
вимагає URL, що містить протокол,
за який драйвер «відповідає».

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ADO
ADO (ActiveX Data Objects) — надбудова над OLE DB (використовує
бібліотеки OLE DB) - додатковий набір бібліотек, що містять COM-об'єкти,
які реалізують інтерфейс доступу до даних. Цей набір бібліотек спочатку
включав дві об'єктні технології Microsoft: Data Access Objects (DAO) і
Remote Data Objects (RDO) - два різних механізму доступу до локальних і
віддалених баз даних відповідно

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ADO
ADO (ActiveX Data Objects) — це бібліотека компонентів СОМ вона
складається, перш за все, з об’єктів Connection, Command, Recordset і
Field. За допомогою ADO відкривається з’єднання з базою даних, після
чого деякі дані зчитуються і поміщаються в набір записів, який
складається з полів; після маніпуляцій з цими даними і оновлення на
сервері з’єднання закривається. Крім того, ADO передбачає так званий
відключений набір записів (disconnected record set), який
використовується, коли з’єднання з базою небажано утримувати
відкритим довгий час.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ADO
Існує декілька проблем, які ADO незадовільно розв’язує. Найбільш
помітна з них — громіздкість (в плані фізичного розміру) відключеного
набору записів. Потреба в цьому засобі зростає з розвитком
веб-орієнтованих обчислень.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Технології ODBC, OLE DB, ADO

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ADO.NET
ADO.NET (Microsoft) (ActiveX Data Objects .NET) - технологія роботи з
базами даних в three-tier (багатоярусна архітектура), коли з'єднання з
базою даних встановлюється лише на період виконання операцій з БД
(як правило короткочасних).
Поява цієї технології пов'язана з необхідністю вирішення протиріччя між
зростанням числа звернень до БД (особливо в БД інтернет-серверів) і
неможливістю бази даних підтримувати необмежене число активних
з’єднань. ADO.NET покликана вирішити ці та інші проблеми і разом з тим
зберегти зручність і простоту програмування.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. ADO.NET
При роботі на платформі .NET для доступу до даних використовується
технологія ADO.NET.
ADO.NET – технологія доступу до баз даних. Яка являє собою набір
бібліотек, що призначений для взаємодії з різними сховищами даних
з .NET-додатків.
ADO.NET була розроблена компанією Microsoft. Основною перевагою
ADO.NET додатків є гнучкість та розвинута підтримка XML.
Деяка схожість з ADO є, проте вона мінімальна;
класи та методи доступу до даних суттєво
відрізняються.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Рівні застосування бібліотеки
ADO.NET
Бібліотеки ADO.NET можна застосовувати трьома різними способами: в
підключеному режимі, в автономному режимі та за допомогою
технології Entity Framework.
При використанні підключеного рівня (connected layer), код явно
підключається до відповідного сховища даних і відключається від нього.
При такому способі використання ADO.NET, як правило відбувається
взаємодія зі сховищем даних за допомогою об’єктів підключення,
об’єктів команд та об’єктів читання даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Рівні застосування бібліотеки
ADO.NET
Автономний рівень (disconnected layer), дозволяє працювати з набором
об’єктів DataTable (що містяться в DataSet), який представляє з боку клієнта
копію зовнішніх даних. При отриманні DataSet за допомогою відповідного
об’єкта адаптера даних підключення відкривається і закривається
автоматично. Такий підхід дозволяє швидко звільняти підключення для інших
викликів і підвищує масштабуємість системи.
Отримавши об’єкт DataSet, викликаючий код може переглядати і обробляти
дані без витрат на мережевий трафік. А якщо потрібно занести зміни в
сховище даних, то адаптер даних (разом з набором операторів SQL)
застосовується для оновлення даних — при цьому підключення відкривається
знову для проведення оновлень в базі, а потім знову закривається.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Рівні застосування бібліотеки ADO.NET
Після випуску .NET 3.5 (2008 р.) в ADO.NET з’явилася підтримка Entity
Framework (EF). Технологія EF дозволяє приховувати багато
низькорівневих деталей роботи з базами даних (наприклад, складні
SQL-запити).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Огляд технологій доступу до даних. Hibernate 
Hibernate — засіб відображення між об'єктами та реляційними
структурами (object-relational mapping, ORM) для платформи Java. Hibernate
є вільним програмним забезпеченням, яке поширюється на умовах GNU Lesser
General Public License. Hibernate надає легкий для використання каркас
(фреймворк) для відображення між об'єктно-орієнтованою моделлю даних і
традиційною реляційною базою даних.
Версія 1.0 випущена в липні 2002 року, через рік
вийшла версія 2.0, ще через рік - 3.0. У випуску від
16 жовтня 2006 з'явилися Hibernate Core, Annotations,
Entity Manager (версія 3.2.0.GA з підтримкою JPA).
У грудні 2013 року випущено Hibernate ORM 4.3.0.
У вересні 2015 випущений Hibernate ORM 5.0.2.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ORM (Object-Relational Mapping)
ORM (Object-Relational Mapping) - технологія програмування, яка зв'язує
бази даних з концепціями об'єктно-орієнтованих мов програмування,
створюючи «віртуальну об'єктну базу даних».
Бібліотеки ORM існують для різних мов програмування.
Технологія ORM дозволяє проектувати роботу з даними в термінах
класів, а не таблиць даних. Вона дозволяє перетворювати класи в дані,
придатні для зберігання в базі даних. Крім того, ORM надає простий API-
інтерфейс для CRUD-операцій над даними. Завдяки технології ORM
немає необхідності писати SQL-код для взаємодії з локальною базою
даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Переваги використання ORM
• наявність явного опису схеми БД, що представлений в термінах деякої мови
програмування;
• можливість оперувати елементами мови програмування, тобто класами, об'єктами,
атрибутами, методами, а не елементами реляційної моделі даних;
• можливість автоматичного створення SQL-запитів, яка позбавляє від необхідності
використання мови для опису структури БД;
• не потрібно створювати нові SQL-запити при перенесенні на іншу СКБД, оскільки за
це відповідає низькорівневий драйвер ORM.
• розвинені реалізації ORM підтримують відображення успадкування та композиції
на таблиці;
• ORM дає можливість ізолювати код програми від особливостей збереження даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Недоліки використання ORM
Основний недолік використання ORM – втрата продуктивності.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ADO.NET
Нова проблема, вирішити яку покликана нова технологія –
кросплатформність.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
Entity Framework Core (EF Core) – версія Entity Framework після EF 6.x.
Це відкрита, легка, розширювана і кросплатформа версія технології
доступу до даних Entity Framework.
EF Core є ORM-інструментом. EF Core дозволяє абстрагуватися від самої
бази даних і її таблиць і працювати з даними незалежно від типу сховища.
Якщо на фізичному рівні ми оперуємо
таблицями, індексами, первинними і
зовнішніми ключами, але на концептуальному рівні,
який нам пропонує Entity Framework, ми вже працюємо
з об'єктами.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
EF Core призначений для використання з додатками .NET Core (.NET).
Однак він також може використовуватися зі стандартними додатками,
що базуються на .NET 4.5+.
За замовчуванням, на даний момент, Microsoft надає низку
вбудованих провайдерів: для роботи з MS SQL Server, для SQLite, для
PostgreSQL. Також є провайдери від сторонніх постачальників,
наприклад, для MySQL.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
EF Core може використовуватися на різних платформах .NET. Це і стандартні
платформи типу Windows Forms, консольні додатки, WPF, ASP.NET 4.6 / 4.7,
ASP.NET Core. Кросплатформна природа EF Core дозволяє задіяти її не лише на
ОС Windows, але і на Linux і Mac OS X (на відміну від EF 6).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
EF Core - це не нова версія по відношенню до EF 6, а інша технологія, хоча в
цілому принципи роботи у них співпадають. В EF Core використовується своя
система версій.
EF Core Version Release Date
EF Core 5 Січень 2021
EF Core 3.1 Грудень, 2019
EF Core 3.0 Вересень 2019
EF Core 2.1.2 Вересень 2018
EF Core 2.0 Серпень 2017
EF Core 1.1 Листопад 2016
EF Core 1.0 Червень 2016

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція. Робота з
даними
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
ADO.NET
(connected layer)
РОБОТА З ДАНИМИ

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Робота з базами даних ADO.NET
Бібліотеки ADO.NET включають класи для приєднання до джерела даних,
виконання запитів і обробки результатів запитів.
Концепція доступу до даних в ADO.NET базується на використанні даних
(представлено об’єктом класу DataSet) зі сторони клієнта та провайдера даних
(представлено об’єктом класу DataProvider), який виступає посередником та
забезпечує взаємодію програми та бази даних зі сторони бази даних, або зі
сторони сервера.
Основною компонентою архітектури ADO.NET є клас DataSet, який являє собою
розміщений в пам’яті кеш даних, завантажених з джерела даних. Клас DataSet
складається з колекції таблиць DataTable, які можна зв’язати між собою за
допомогою об’єктів класу DataRelation. Для забезпечення цілісності даних в класі
DataSet можна використовувати об’єкти UniqueConstraint та ForeignKeyConstraint.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET
Двома основними компонентами ADO.NET для доступу до даних і їх
обробки є постачальники даних Data Provider та DataSet.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних
Постачальниками даних (data provider, DBProviderFactory) є компоненти,
спеціально сконструйовані для обробки даних і швидкого, однопрохідного
доступу до даних призначених лише для читання. Об’єкт Connection забезпечує
обмін даними з джерелом даних.  Об’єкт Command дозволяє звертатися до
команд БД для повернення даних, зміни даних, виконання зберігаємих процедур
і передачі чи отримання відомостей про параметри. DataReader забезпечує
високопродуктивний потік даних з джерела даних. DataAdapter надає місток між
об’єктом DataSet та джерелом даних. DataAdapter використовує об’єкти 
Command для виконання команд SQL
на джерелі даних для завантаження DataSet
даними та узгодження змін даних, виконаних в 
DataSet, з джерелом даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних
В таблиці наведено деякі загальні основні об’єкти, їх базові класи (визначені в
просторі імен System.Data.Common) та основні інтерфейси (визначені в просторі
імен System.Data), які вони реалізують:
Тип об’єкта Абстрактний Інтерфейси Призначення
базовий клас

Дозволяє підключатися та відключатися до (від)


Connection DbConnection IDbConnection сховища даних. Забезпечують доступ до
відповідних об’єктів транзакцій;

Представляє SQL-запит чи зберігаєму


Command DbCommand IDbCommand процедуру. Крім того, об’єкти команд надають
доступ до об’єкта читання даних конкретного
постачальника даних;

IDataReader Надає доступ до даних лише для читання в


DataReader DbDataReader IDataRecord прямому напрямку на стороні сервера;

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних

Пересилає набори даних зі сховища


даних до процесу, який їх викликає
і назад. Адаптери даних містять
DataAdapter DbDataAdapter IDataAdapter, підключення і набір з чотирьох
IDbDataAdapter внутрішніх об’єктів команд для
вибірки, вставки, зміни та
видалення інформації в сховищі
даних.

Parameter DbParameter IDataParameter, Іменований параметр в


IDbDataParameter параметризованому запиті.

Transaction DbTransaction IDbTransaction Інкапсулює транзакцію в базі даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних
Конкретні імена цих основних класів відрізняються у різних
постачальників (наприклад, SqlConnection, OracleConnection,
OdbcConnection та MySqlConnection), але всі ці об’єкти породжені від
одного і того ж базового класу (у випадку об’єктів підключення це
DbConnection), який реалізує ідентичні інтерфейси (такі як
IDbConnection). Тому, навчившись працювати з одним постачальником
даних, то легко можна працювати і з іншими.

В ADO.NET термін «об’єкт підключення» насправді відноситься до


конкретного типу, породженого від DbConnection; об’єкта підключення
«взагалі» немає. Те саме можна сказати і про «об’єкт команди», «об’єкт
адаптера даних» і т.д. Згідно домовленості імена об’єктів в конкретному
постачальнику даних мають префікси відповідної СКБД (наприклад,
SqlConnection, OracleConnection, SqlDataReader і т.д.).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних
Однією з головних ідей, що лежать в основі моделі постачальників
ADO.NET, є розширюємість. Іншими словами, розробники можуть
створювати власні постачальники для патентованих джерел даних. Деякі
незалежні розробники також продають власні постачальники даних для
.NET.
.NET Framework надає чотири постачальника - SQL Client.NET Data Provider,
OLE DB.NET Data Provider, Oracle Data Provider (вважається застарілим, і
рекомендується OPD.NET від Oracle) та ODBC Data Provider. Кожен
постачальник даних .NET реалізує однакові базові класи — Connection,
Command, DataProvider, Parameter і Transaction, конкретне ім'я яких
залежить від постачальника. Так, у постачальника SQL Client.NET Data
Provider є об'єкт SqlConnection, а у постачальника OLE DB. NET Data
Provider — об'єкт OleDbConnection.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Абстрактна фабрика

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних
Постачальник Простір імен Компоновочний блок
даних

OLE DB System.Data.OleDb System.Data.dll


Microsoft SQL System.Data.SqlClient System.Data.dll
Server

Microsoft SQL System.Data.SqlServerCe System.Data.SqlServerCe.dll


Server Mobile

ODBC System.Data.Odbc System.Data.dll


Oracle System.Data.OracleClient System.Data.OracleClient.dll
Використовуючи ADO.NET можна реалізувати як класичні клієнт-серверні додатки,
в яких клієнтська програма напряму звертається до БД за допомогою SQL-запитів,
так і багаторівневі роз’єднані додатки, в яких важливо мати можливість
працювати з копіями даних, які не мають постійного підключення до сервера.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. Постачальники даних

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Для прикладу, будемо працювати з раніше створеною БД DBLibrary,
створеної в Micrsoft SQL Server (створення див. sql_server.doc):

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних
Перше, що потрібно зробити при роботі з постачальником даних — це
встановити сеанс з джерелом даних за допомогою об’єкта з’єднання. Для
цього потрібно знати ім’я машини (її IP адресу), до якої потрібно
підключитися, необхідні параметри безпеки, ім’я бази даних на цій машині
і деяку іншу інформацію, що залежить від постачальника.
При створенні з’єднання з Microsoft SQL Server необхідно зазначити
значення наступних параметрів: server – ім’я комп’ютера (його IP адресу),
на якому встановлено Microsoft SQL Server; uid – обліковий запис
користувача Microsoft SQL Server; pwd - пароль облікового запису
користувача Microsoft SQL Server; database – ім’я бази даних, з якою
необхідно створити з’єднання. Рядок з’єднання може бути зазначений при
виклиці конструктора об’єкта класу SqlConnection, або через присвоєння
значення властивості ConnectionString інтерфейса IDbConnection.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних
Для відкриття з’єднання з базою даних використовується метод void Open()
інтерфейса IDbConnection. Для закриття з’єднання з базою даних
використовується метод void Close() інтерфейса IDbConnection.
Приклад
SqlConnection c = new SqlConnection("...");
c.Open();
try{// Робота з базою даних...
}
finally{
c.Close();
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних (див. приклад)
Для початку створимо консольну програму, яка буде виводити список
категорій книг.

Для цього спочатку імпортуємо простори імен System.Data,


System.Data.SqlClient та System.Configuration. Потім додамо файл
Арр.config в поточний проект (якщо його немає).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних (див. приклад)
Відредагуємо App.config наступним чином (нове виділено червоним):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<appSettings>
<!--Постачальник -->
<add key="provider" value="System.Data.SqlClient"/>
</appSettings>
<connectionStrings>
<add name="DBLibrarySqlConnectionStrings"
connectionString="Data Source=PC-FYB10;
Initial Catalog=DBLibrary;Integrated Security=True"/>
</connectionStrings>
</configuration>

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних (див. приклад)
Найчастіше при написанні програми, ми заздалегідь знаємо з яким саме
постачальником даних ми матимемо справу:

private static void Main(string[] args)


{// Отримання рядка підключення з *.config
string cnStr = ConfigurationManager.ConnectionStrings
["DBLibrarySqlConnectionStrings"].ConnectionString;

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
// Отримання об'єкта підключення
using (SqlConnection cn = new SqlConnection())
{
cn.ConnectionString = cnStr;
try
{ // Відкриття підключення
cn.Open();
// Створення об'єкта команди
SqlCommand cmd = cn.CreateCommand();
Console.WriteLine("Об'єкт команди - " +
cmd.GetType().Name);
cmd.Connection = cn;
cmd.CommandText = "Select * from DIC_CATEGORIES";
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
// Виведення даних за допомогою об'єкта читання даних
using (DbDataReader dr = cmd.ExecuteReader())
{
Console.WriteLine("Об'єкт читання даних - " + dr.GetType().Name);
Console.WriteLine("\n Категорiї \n");
while (dr.Read())
Console.WriteLine("-> Номер #{0} - Назва {1} –
Iнформацiя {2}\n",
dr["DC_ID"], dr["DC_NAME"], dr["DC_INFO"]);
}
Console.ReadLine();
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{ //Гарантоване звільнення підключення
cn.Close();
}
}
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підключення до бази даних (див. приклад)
Запускаємо:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Команди
В описаному вище прикладі вже застосовувався об’єкт SqlCommand. Розглянемо його
детальніше.
Тип SqlCommand (породжений від DbCommand) являє собою об’єктно-орієнтоване
представлення SQL-запиту, імені таблиці чи зберігаємої процедури. Тип команди визначається
властивістю CommandType, яка приймає значення порядкового типу CommandType: Text (по
замовчуванню), StoreProcedure чи TableDirect. При створенні об’єкта команди можна одразу
задати йому SQL-запит в конструкторі, або пізніше властивістю CommandText.
Приклад
/*c – раніше відкрите підключення textSQL - текст SQL запита */
 SqlCommand cmd1 = new SqlCommand(textSQL, c);
 SqlCommand cmd2 = new SqlCommand();
cmd2.Connection = c;
cmd2.CommandText = textSQL;

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконання команд
Після того, як команда визначена, її необхідно виконати. Класи
<provider>Command передбачають наступні методи виконання:
ExecuteNonQuery() виконує команду і повертає кількість записів в якості
результату виконання запиту. Використовується метод int
ExecuteNonQuery() для виконання команд INSERT, UPDATE, DELETE чи
виконання зберігаємих процедур, а також запитів мови маніпулювання
даними та мови керування даними інтерфейсу IDbCommand;
ExecuteReader() виконує команду і повертає типізований IDataReader;
ExecuteScalar() виконує команду і повертає значення з першого
стовпчика першого рядка довільного результуючого набору.
Повернення єдиного результату.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконання команд (ExecuteNonQuery)
private static void Main(string[] args)
{
// Отримання рядка підключення з *.config
string cnStr =
ConfigurationManager.ConnectionStrings["DBLibrarySqlConnectionStrings"].ConnectionString;
// Отримання об'єкта підключення
using (SqlConnection cn = new SqlConnection())
{
cn.ConnectionString = cnStr;
try
{
cn.Open();
string strSQL = "UPDATE DIC_CATEGORIES SET DC_INFO = DC_NAME";
SqlCommand cmd = new SqlCommand(strSQL, cn); // Створення об'єкта команди
int i = cmd.ExecuteNonQuery();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконання команд (ExecuteNonQuery)
Console.WriteLine("Кiлькiсть змiнених рядкiв: {0}", i);
Console.ReadLine();
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
cn.Close();
}
}
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконання команд (ExecuteReader)
private static void Main(string[] args)
{
// Отримання рядка підключення з *.config
string cnStr = ConfigurationManager.ConnectionStrings
["DBLibrarySqlConnectionStrings"].ConnectionString;
// Отримання об'єкта підключення
using (SqlConnection cn = new SqlConnection())
{
cn.ConnectionString = cnStr;
try
{
cn.Open();
string strSQL = "Select * from DIC_CATEGORIES";
SqlCommand cmd = new SqlCommand(strSQL, cn); // Створення об'єкта команди
SqlDataReader dr = cmd.ExecuteReader();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
while (dr.Read())
Виконання команд (ExecuteReader)
{
Console.WriteLine("-> Номер #{0} - Назва {1} – Iнформацiя {2}\n",
dr["DC_ID"], dr["DC_NAME"], dr["DC_INFO"]);
}
Console.ReadLine();
}
catch (SqlException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
cn.Close();
}
}
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Виконання команд (ExecuteReader)
Запускаємо:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Параметризовані об’єкти команд
Для підтримки параметризованих запитів об’єкти команд ADO.NET
підтримують колекцію окремих об’єктів параметрів. По замовчуванню
ця колекція порожня, але в неї можна занести довільну кількість об’єктів
параметрів, які відповідають параметрам-заповнювачам (placeholder
parameter) в SQL-запиті. Якщо потрібно зв’язати параметр SQL-запита з
членом колекції параметрів деякого об’єкту команди, слід поставити
перед параметром SQL символ @ (принаймні, при роботі з Microsoft SQL
Server).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Параметризовані об’єкти команд
Базовим класом для об’єктів параметрів постачальників є DbParameter.
Деякі його властивості:
 DbType – тип даних параметра (тип CLR);
 Direction – вид параметра (лише для вводу, лише для виводу, для вводу
і виведення, для повернення значення);
 ParameterName – ім’я параметра;
 Size – максимальний розмір даних для параметра (корисне для рядків);
 Value – значення параметру.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
private static void Main(string[] args)
{//Отримання рядка підключення з *.config
string cnStr = ConfigurationManager.ConnectionStrings["DBLibrarySqlConnectionStrings"].ConnectionString;
using (SqlConnection cn = new SqlConnection(cnStr))
{// Створення об'єкта команди з параметрами
cn.Open();
string strSQL = @"Insert into DIC_CATEGORIES (DC_NAME, DC_INFO) values
(@DC_NAME, @DC_INFO); SELECT SCOPE_IDENTITY();";
using (SqlCommand cmd = new SqlCommand(strSQL, cn))
{//задання параметрів
cmd.Parameters.Add(new SqlParameter { ParameterName = "@DC_NAME",
Value = "Фантастика", SqlDbType = SqlDbType.Char });
cmd.Parameters.Add(new SqlParameter { ParameterName = "@DC_INFO",
Value = "Iнфо фантастика", SqlDbType = SqlDbType.Char });
string id = cmd.ExecuteScalar().ToString();
Console.WriteLine("Запис з iдентифiкатором {0} додано", id);
}
Console.ReadKey(); } }

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Параметризовані об’єкти команд
Запускаємо:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Транзакції
Транзакція — це набір операцій в базі даних, які повинні бути або всі
виконані, або всі не виконані. Транзакції застосовуються для
забезпечення безпеки, правильності та несуперечливості даних в БД.
Нехай нам потрібно додати в одній транзації книгу та прив’язати до неї
авторів.
Об’єкти, які працюють з транзакціями породжені від DbTransaction та
реалізують інтерфейс IDbTransaction.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Транзакції
internal class Program
{
private static string strSQLBook = @"Insert into BOOKS (BK_NAME, BK_INFO,
BK_DC)
values (@name, @info, @cat);
select SCOPE_IDENTITY();";

private static string strSQLBookAuthor = @"Insert into AUTHORS_BOOKS


(AB_BK, AB_AU)
values (@book_id, @author_id)";

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
public static void ProcessInsertBook(SqlConnection cn, int[] authors_id, int cat, string name, string info)
{
using (SqlTransaction transaction = cn.BeginTransaction()) {
try {
int book_id = 0; //ідентифікатор нової книжки
using (SqlCommand cmdBook = new SqlCommand(strSQLBook, cn, transaction)) {
cmdBook.Parameters.Add(new SqlParameter { ParameterName ="@name",
Value = name, SqlDbType = SqlDbType.Char });
cmdBook.Parameters.Add(new SqlParameter { ParameterName = "@info",
Value = info, SqlDbType = SqlDbType.Char });
cmdBook.Parameters.Add(new SqlParameter { ParameterName = "@cat",
Value = cat, SqlDbType = SqlDbType.Int });
book_id = Convert.ToInt32(cmdBook.ExecuteScalar()); }
insertAuthors(cn, authors_id, transaction, book_id);
transaction.Commit(); }
catch (Exception) {
transaction.Rollback();
throw; } } }

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
private static void insertAuthors(SqlConnection cn, int[] authors_id,
SqlTransaction transaction, int book_id)
{
using (SqlCommand cmdAuthorBook = new SqlCommand(strSQLBookAuthor,
cn, transaction))
{
SqlParameter pBook = new SqlParameter {ParameterName = "@book_id",
SqlDbType = SqlDbType.Int, Value = book_id};
SqlParameter pAuthor = new SqlParameter {ParameterName = "@author_id",
SqlDbType = SqlDbType.Int};
cmdAuthorBook.Parameters.Add(pBook);
cmdAuthorBook.Parameters.Add(pAuthor);
foreach (int au_id in authors_id)
{
pAuthor.Value = au_id;
cmdAuthorBook.ExecuteNonQuery();
} }}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
private static void Main(string[] args)
{
// Отримання рядка підключення з *.config
string cnStr = ConfigurationManager.ConnectionStrings
["DBLibrarySqlConnectionStrings"].ConnectionString;
// Отримання об'єкта підключення
using (SqlConnection cn = new SqlConnection(cnStr))
{
cn.Open();
ProcessInsertBook(cn, new int[] {3}, 1, "book", "info");
Console.ReadKey();
}
}}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція 3. Робота з даними.
ADO.NET
(DataSet, Adapter)
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Автономний рівень
Автономні типи можна використовувати без підключення до бази даних, але як
правило застосовуються підключення та об’єкти команд. Крім того,
використовується об’єкт — адаптер даних (який розширює абстрактний тип
DbDataAdapter), що надає та оновлює дані. Але, на відміну від підключеного рівня,
дані, отримані через адаптер даних, не обробляються за допомогою об’єктів
читання даних. Замість цього об’єкти адаптерів пересилають дані між
викликаючим процесом і джерелом даних за допомогою об’єктів DataSet.
Тип DataSet являє собою контейнер для довільної кількості об’єктів DataTable,
кожен з яких містить колекцію об’єктів DataRow та DataColumn. Об’єкт адаптера
даних конкретного постачальника автоматично обслуговує підключення до бази
даних. Для підвищення масштабуємості адаптери даних тримають підключеня
відкритим мінімально можливий час. Як тільки викликаючий процес отримує
об’єкт DataSet, викликаючий рівень повністю відключається від БД і залишається з
локальною копією віддалених даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Автономний рівень
Можна вставляти, видаляти чи змінювати рядки різних об’єктів DataTable,
але фізична БД не оновлюється, поки викликаючий процес явно не передасть
DataSet адаптеру даних для оновлення. Об’єкти DataSet імітують постійне
підключення клієнтів, але насправді працюють з БД, яка знаходиться в
пам’яті.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. DataSet
Клас DataSet в ADO.NET спеціально сконструйовано для доступу до
даних незалежно від джерела даних. Тому він може бути використаний
з багатьма різними джерелами даних, наприклад з XML-даними,
даними БД. Клас DataSet — це контейнер даних (з однієї чи декількох
таблиць джерела даних) загального призначення. DataSet повністю
узагальнений т.б. спеціалізовані постачальники не визначають власних
спеціалізованих версій класу DataSet.
DataSet містить колекцію одного чи декількох об’єктів DataTable, які
складаються з рядків та стовпчиків даних, а також первинний ключ,
зовнішній ключ, обмеження та відомості про дані в об’єктах DataTable. 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. DataSet
Модель об’єктів DataSet:
 

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. DataSet
DataSet є автономним об’єктом. Автономні типи можна використовувати
без підключення до БД, але, як правило, застосовується підключення і
об’єкти команд. Крім того, використовується і особливий об’єкт — адаптер
даних (який розширює абстрактний тип DbDataAdapter), що постачає та
оновлює дані. Але, на відміну від підключеного рівня, дані, отримані через
адаптер даних, не обробляються за допомогою об’єктів читання даних.
Замість цього об’єкти адаптерів пересилають дані між викликаючим
процесом і джерелом даних за допомогою об’єктів DataSet.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET. DataSet
IDbDataAdapter - це один із вбудованих інтерфейсів .Net у System.Data.

Інтерфейс IDbDataAdapter успадковується від інтерфейсу IDataAdapter і


дозволяє об'єкту створювати DataAdapter, призначений для використання
з реляційною базою даних.
 IDbDataAdapter має кілька похідних типів, включаючи конкретний клас під
назвою DbDataAdapter, а також ви знайдете OdbcDataAdapter,
OleDbDataAdapter, OracleDataAdapter та SqlDataAdapter. Кожна з яких
реалізує в своїй основі інтерфейс IDbDataAdapter.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Архітектура ADO.NET

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DataSet
Властивість Tables класу DataSet надає доступ до
колекції DataTableCollection, що містить окремі об’єкти DataTable.
DataSet є автономною версією схеми БД, а отже, його можна
використовувати для програмного представлення відношень між
таблицями. Наприклад, за допомогою типу DataRelation можна
створювати відношення між двома таблицями, що імітує відношення
зовнішнього ключа. Потім, за допомогою властивості Relations цей
об’єкт можна додавати в колекцію DataRelationCollection. Тепер, при
пошуці даних, можна переміщатися взаємопов’язаними таблицями.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Властивості DataSet
Властивість ExtendedProperties надає доступ до об’єкту PropertyCollection, який
дозволяє пов’язати з DataSet довільну додаткову інформацію у вигляді пар
ім’я/значення.
Крім властивостей Tables, Relations та ExtendedProperties, нижче наведено декілька
додаткових властивостей:
CaseSensitive - зазначає, чи чуттєві до регістру букв порівняння рядків в об’єктах
DataTable. По замовчуванню false (без врахування регістра).
DataSetName – задає ім’я для заданого DataSet. Як правило передається в
конструкторі.
EnforceConstraints - задає чи отримує значення, яке визначає, чи застосовуються
правила обмежень при виконанні довільних оновлень (по замовчуванню true).
HasErrors – отримує значення, яке визначає, чи є помилки в довільному рядку
довільного з об’єктів DataTable даного DataSet.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Методи DataSet
DataSet містить багато методів для роботи з таблицями, зокрема:
AcceptChanges() – відправляє усі зміни, виконані в DataSet після завантаження чи останнього
виклику AcceptChanges();
Clear() - повністю очищує DataSet;
Clone() - клонує всю структуру DataSet;
Copy() - копіює структуру і дані поточного DataSet;
GetChanges() - повертає копію DataSet, що містить усі зміни, які було виконано в даному DataSet
після завантаження чи останнього виклику AcceptChanges(). У цього методу є перевантаження,
які дозволяють отримати лише нові рядки, лише змінені, або лише видалені рядки;
HasChanges() - видає, чи містить DataSet зміни;
Merge() – об’єднує даний DataSet із зазначеним DataSet;
RejectChanges() – відміняє усі зміни, що були виконані в DataSet після його завантаження чи
останнього виклику методу AcceptChanges().

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DataColumn
Тип DataColumn представляє схему стовпчика таблиці в об’єкті DataTable. Клас DataColumn має низку
властивостей:
AllowDBNull показує, чи може містити порожні значення. По замовчуванню true;
AutoIncrement, AutoIncrementSeed, AutoIncrementStep для налаштування поведінки автоінкременту. По
замовчуванню DataColumn не підтримує;
Caption задає чи отримує заголовок стовпчика;
ColumnName задає чи отримує ім’я стовпчика з колекції Columns (внутрішнє представлення в DataTable);
DataType тип даних;
DefaultValue задає чи отримує значення по замовчуванню для даних цього стовпчика;
Expression задає чи отримує вираз для фільтрації рядків, обчислення значення стовпчика чи створення
агрегованого стовпчика;
Ordinal задає чи отримує числове положення стовпчика в колекції Columns;
Readonly визначає чи призначено заданий стовпчик лише для читання. По замовчуванню false;
Table отримує об’єкт DataTable, який містить заданий DataColumn;
Unique задає чи отримує прикмету необхідності унікальності значень стовпчика.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DataRow
Об’єкт DataRow представляє рядок таблиці. Колекція об’єктів DataRow представляє
дані таблиці. Опишемо деякі члени класу DataRow:
HasErrors – повертає логічне значення, яке повідомляє про наявність помилок;
GetColumnsInError() – у випадку наявності помилок дозволяє отримати помилкові
рядки;
GetColumnError() — у випадку наявності помилок дозволяє отримати опис помилки;
ClearErrors() – видаляє з рядка всю інформацію про помилки;
RowError – дозволяє створити текстовий опис помилки для даного рядка;
ItemArray – задає чи отримує усі значення cтовпчиків рядка у вигляді масива
об’єктів;
RowState – фіксує поточний стан об’єкта DataRow в DataTable за допомогою
значення переліковного типу RowState (новий, змінений, не змінений, видалений);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DataRow
Table – властивість, яка дозволяє отримати посилання на об’єкт DataTable;
AcceptChanges(), RejectChanges() – методи для фіксації чи відміни усіх змін, виконаних в
рядку з моменту останнього виклику AcceptChanges();
BeginEdit(), EndEdit(), CancelEdit() - методи, що починають, завершують чи відміняють
операцію редагування об’єкту DataRow;
Delete() - метод, відмічає заданий рядок для видалення при виклиці метода AcceptChanges();
IsNull() - метод, який отримує значення, яке зазначає, чи містить стовпчик порожнє значення;
RowState – властивість, яка приймає значення з переліку DataRowState (Added – рядок
додано в DataRowCollection, але AcceptChanges() ще не викликано; Deleted - рядок відмічено
методом Delete(), але AcceptChanges() ще не викликано; Detached - рядок створено, але не в
DataRowCollection (об’єкт знаходиться в цьому стані після створення, але до занесення в
колекцію, або після виключення з колекції); Modified – рядок змінено, але AcceptChanges()
ще не викликано; Unchanged – рядок не змінено після останнього виклику AcceptChanges()).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
RowState

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
RowState
// Make a simple table with one column. Console.WriteLine("AddRow " + row.RowState);
DataTable table = new DataTable("table"); table.AcceptChanges();
DataColumn dcFirstName = new DataColumn( // Unchanged row.
"FirstName", Type.GetType("System.String")); Console.WriteLine("AcceptChanges " + row.RowState);
table.Columns.Add(dcFirstName); row["FirstName"] = "Scott";
DataRow row; // Modified row.
// Create a new DataRow. Console.WriteLine("Modified " + row.RowState);
row = table.NewRow(); row.Delete();
// Detached row. // Deleted row.
Console.WriteLine("New Row " + row.RowState); Console.WriteLine("Deleted " + row.RowState);
table.Rows.Add(row); Console.ReadKey();
// New row.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DataTable
Деякі основні члени типу DataTable, крім Rows і Columns:
CaseSensitive - вказує, чи чуттєві до регістру символів порівняння в таблиці. По замовчуванню
false;
ChildRelations - повертає колекцію дочірніх відношень для DataTable (якщо вони є);
Constraints – отримує колекцію обмежень для таблиці;
Copy() - копіює схему і дані DataTable в новий екземпляр;
DataSet - отримує DataSet, що містить таблицю (якщо він є);
DefaultView – отримує спеціалізоване представлення таблиці, яке може містити
відфільтроване представлення чи позицію курсора;
ParentRelations – отримує колекцію батьківських відношень для DataTable;
PrimaryKey – отримує чи задає масив стовпчиків, які виступають первинними ключами для
таблиці;
TableName – отримує чи задає ім’я таблиці. Значення цієї властивості можна також задавати
через параметр конструктора.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Адаптери даних
Клас адаптерів даних застосовується для заповнення наборів даних
DataSet за допомогою об’єктів DataTable; крім того, вони можуть
відправляти змінені DataTable назад в базу даних для обробки. Наведемо
основні члени базового класу DbDataAdapter, від якого породжуються всі
об’єкти адаптерів даних (напр., SqlDataAdapter та OdbcDataAdapter):
Fill() Виконує команду SQL SELECT (зазначену у властивості SelectCommand) для
запиту до БД і завантаження даних в об’єкт DataTable

SelectCommand, 
InsertCommand,  Містять SQL-команди, що відправляються до сховища даних при викликах
UpdateCommand, методів Fill() та Update()
DeleteCommand

Update() Виконує команди SQL INSERT, UPDATE та DELETE (зазначені властивості


InsertCommand, UpdateCommand та DeleteCommand)

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Адаптери даних
Після налаштування кожного з об’єктів команд (SelectCommand,
InsertCommand, UpdateCommand і DeleteCommand) можна викликати
метод Fill() і отримати об’єкт DataSet (чи, за бажання, окремий DataTable).
Для цього об’єкт команди виконує оператор SQL SELECT, заданий за
допомогою властивості SelectCommand.
Аналогічно, за необхідності зберегти зміни в об’єкті DataSet (чи
DataTable) в БД для обробки можна викликати метод Update(), який
використовує потрібний з об’єктів InsertCommand, UpdateCommand чи
DeleteCommand в залежності від стану кожного рядка в DataTable.
При роботі з адаптером не потрібно відкривати чи закривати
підключення до БД. Все це здійснюється автоматично. Проте, адаптеру
слід передати об’єкт підключення, щоб повідомити йому з якою БД слід
взаємодіяти.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція 5.
Робота з даними
Entity Framework Core(EF)
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
Entity Framework Core (EF Core) – нова версія Entity Framework після
EF 6.x. Це відкрита, легка, розширювана і кросплатформа версія
технології доступу до даних Entity Framework.
EF Core є ORM-інструментом (object-relational mapping -
відображення даних на реальні об'єкти). Тобто EF Core дозволяє
працювати базами даних, але є більш високий рівень абстракції: EF Core
дозволяє абстрагуватися від самої бази даних і її таблиць і працювати з
даними незалежно від типу сховища. Якщо на фізичному рівні ми
оперуємо таблицями, індексами, первинними і зовнішніми ключами,
але на концептуальному рівні, який нам пропонує Entity Framework, ми
вже працюємо з об'єктами.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
EF Core призначений для використання з додатками .NET Core. Однак
він також може використовуватися зі стандартними додатками, що
базуються на .NET 4.5+.
За замовчуванням на даний момент Microsoft надає низку
вбудованих провайдерів: для роботи з MS SQL Server, для SQLite, для
PostgreSQL. Також є провайдери від сторонніх постачальників,
наприклад, для MySQL.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
EF Core може використовуватися на різних платформах .NET. Це і стандартні
платформи типу Windows Forms, консольні додатки, WPF, ASP.NET 4.6 / 4.7,
ASP.NET Core. Кросплатформна природа EF Core дозволяє задіяти її не лише на
ОС Windows, але і на Linux і Mac OS X (на відміну від EF 6).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Версії EF Core
EF Core - окрема версія по відношенню до EF 6, а інша технологія, хоча в
цілому принципи роботи у них співпадають. В EF Core використовується своя
система версій.
EF Core Version Release Date
EF Core 5 Січень 2021
EF Core 3.1 Грудень, 2019
EF Core 3.0 Вересень 2019
EF Core 2.1.2 Вересень 2018
EF Core 2.0 Серпень 2017
EF Core 1.1 Листопад 2016
EF Core 1.0 Червень 2016
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Версії EF Core

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Порівняння EF Core та EF 6
EF Core підтримує такі функції та концепції, як і EF 6:
• DbContext & DbSet;
• Data Model;
• Запити з використанням Linq-to-Entities;
• Change Tracking (відслідковування змін);
• SaveChanges (збереження змін);
• Migrations (міграція).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DBContext

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Загальна характеристика EF Core
Основу функціональності Entity Framework Core для роботи з СКБД
складають класи, які розташовуються в просторі імен
Microsoft.EntityFrameworkCore. Серед усього набору класів цього
простору імен слід виділити наступні:
DbContext: визначає контекст даних, який використовується для
взаємодії з базою даних
DbSet / DbSet <TEntity>: представляє набір об'єктів, які зберігаються в
базі даних
DbContextOptionsBuilder: встановлює параметри підключення.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DBContext

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Загальна характеристика EF Core
Як і в EF 6 центральною концепцією Entity Framework Core є поняття
сутності (entity). Сутність визначає набір даних, які пов'язані з певним
об'єктом. Як і EF 6, технологія EF Core передбачає роботу не з таблицями, а
з об'єктами та їх колекціями.
Довільна сутність, як і будь-який об'єкт з реального світу, має низку
властивостей (ім'я, назва, …). У кожної сутності може бути одна або
декілька властивостей, які будуть відрізняти цю сутність від інших та
будуть унікально визначати цю сутність (ключі).
Сутності можуть бути пов'язані асоціативним зв'язком один-до-багатьох,
один-до-одного і багато-до-багатьох. Як і в БД зв'язок здійснюється через
зовнішні ключі. Як і в EF 6, в EF Core для формування запитів
використовується LINQ to Entities.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підходи до розробки з використанням Entity Framework
Core
EF Core підтримує два підходи до розробки:
1) Code-First;
2) Database-First.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
Міграція також дуже важлива під час розгортання. Нехай проєкт розробляється
локально, але після розгортання програми база даних також повинна відповідати
новій моделі даних. Оскільки це автоматизовано за допомогою міграцій, вам не
потрібно робити це вручну. Проте, міграція вимагає обережності, неправильна
міграція може зламати вашу програму. Потрібно бути обережним, особливо з
зовнішніми ключами. Це може спричинити винятки з нульовим посиланням.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
ModelSnapshot - це поточний стан моделі, що зберігається у файлі класу з назвою
<YourContext>ModelSnapshot.cs.
Файл додається до папки Migrations при створенні першої міграції та оновлюється при
кожній наступній міграції. Це дозволяє фреймворку міграцій вираховувати зміни,
необхідні для оновлення бази даних до моделі.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
Файл <YourContext>ModelSnapshot.cs містить знімок поточної схеми. Це клас, який
перекладає вашу модель на схему бази даних. Після створення міграції EF шукає
різницю між моделлю даних та файлом знімків. Він також використовується, коли
потрібно видалити міграцію.
Знімок також важливий для команд. Як що кілька програмістів працюють над однією
моделлю даних. Кожна людина вносить якісь зміни, повинен бути спосіб
синхронізувати відмінності. Проте, неможливо синхронізувати модель і БД постійно,
оскільки існують взаємовиключні сценарії (наприклад, одна людина перейменовує
стовпець, інша людина видаляє його). Іноді все ще потрібне ручне втручання людини.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Шаблон Memento

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Підходи до розробки з використанням Entity Framework
Core
EF Core більше орієнтований на підхід Code-First.
При використанні підходу Code-First EF Core API створює базу даних
та таблиці, що використовують міграцію, на основі конфігурації, наданих
у ваших класах. Цей підхід корисний у розробці на основі предметної
області Domain Driven Design (DDD).
При використанні підходу Database-First EF Core API створює доменні
та контекстні класи на основі існуючої бази даних за допомогою команд
EF Core. В EF Core немає візуального дизайнера для підходу Database-
First, на відміну від EF 6.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core
Entity Framework Core, як і Entity Framework 6 використовує модель
постачальника для доступу до багатьох різних СКБД.
EF Core включає постачальників як NuGet пакети.
За замовчуванням Microsoft надає низку вбудованих провайдерів:
для роботи з MS SQL Server, SQLite та PostgreSQL. Крім того, існує низка
провайдерів від сторонніх постачальників, наприклад, для MySQL.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Постачальники
СКБД NuGet-пакет
SQL Server Microsoft.EntityFrameworkCore.SqlServer

MySQL MySql.Data.EntityFrameworkCore

PostgreSQL Npgsql.EntityFrameworkCore.PostgreSQL

SQLite Microsoft.EntityFrameworkCore.SQLite

SQL Compact EntityFrameworkCore.SqlServerCompact40

In-memory Microsoft.EntityFrameworkCore.InMemory

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Entity Framework Core

Див. інструкції по роботі з EF Core

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення
Для взаємодії з базою даних для контексту даних повинна бути
визначена конфігурація підключення. Для її встановлення можна
застосовувати два способи:
1) Перевизначення у класу контексту даних методу OnConfiguring ().
2) Передача конфігурації в конструктор базового класу DbContext.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Перевизначення у класу
контексту даних методу OnConfiguring ()

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Перевизначення у класу
контексту даних методу OnConfiguring ()
В метод OnConfiguring() передається об’єкт DbContextOptionsBuilder,
який дозволяє створити параметри підключення.
В нашому випадку, для створення параметрів підключення
викликається метод UseSqlServer, в який передається рядок
підключення.
Server: назва сервера. У випадку використання локального MS SQL
Server, який призначений спеціально для потреб розробки:
Server=(localdb)\mssqllocaldb;
Database: назва файлу бази даних без розширення mdf.
Trusted_Connection: встановлює перевірку.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Передача конфігурації в
конструктор базового класу DbContext
За другим способом потрібно передати в конструктор базового
класу DbContextOptions об'єкт, який інкапсулює параметри конфігурації.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Передача конфігурації в
конструктор базового класу DbContext
Тепер можна використовувати клас контексту:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації
Для зберігання параметрів підключення в зовнішньому файлі підключення, який
можна використовувати без перекомпіляції додамо в проект елемент JSON File:

JSON (англ. JavaScript Object Notation) — це


текстовий формат обміну даними між комп'ютерами. JSON базується на тексті,
може бути прочитаним людиною. Формат дає змогу описувати об'єкти та
інші структури даних. Цей формат використовується переважно для передачі
структурованої інформації через мережу завдяки процесу перетворення в
послідовність бітів (серіалізації).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації
Додамо через NuGet пакети:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Конфігурація підключення. Файл конфігурації

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні операції з даними. CRUD
Більшість операцій з даними представляють собою CRUD операції (Create, Read,
Update, Delete), тобто створення, отримання, оновлення та видалення даних.
Entity Framework Core дозволяє легко виконувати всі ці дії.
DbSet (і в EF6 і в EF Core) включає методи Add, Attach і Remove. Результат цих
методів в окремому об'єкті: вони присвоюють станам об'єкта відповідне EntityState:
Add змінює стан на Added, Attach - на Unchanged і Remove - на Deleted.
Є одне виключення: якщо видаляється сутність, яка відома як Added, вона буде
від'єднана від DbContext, оскільки відслідковувати нову сутність більше немає
потреби. У EF, при застосуванні цих методів з графами, їх вплив на відповідні об'єкти
не зовсім узгоджений. Раніше не відслідковувані об'єкти не можна видалити, і така
спроба призводить до помилки в EF. Уже відстежувані об'єкти можуть мати ще не
змінений стан в залежності від того, якими є ці стани.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні операції з даними. CRUD

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні операції з даними. Додавання (Create)
Для додавання об’єкта використовується метод Add, визначений у класа DbSet, в який
передається об’єкт який додається:

Метод Add() встановлює значення EntityState в Added в якості стану нового об’єкту.
Метод SaveChanges() згенерує вираз INSERT для вставки моделі у відповідну таблицю.
Для додавання декількох об’єктів існує метод AddRange():

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні операції з даними. Редагування (Update)
При зміні об'єкта Entity Framework сам відстежує всі зміни, і коли
викликається метод SaveChanges(), буде сформовано SQL-вираз UPDATE
для даного об'єкта, який оновить об'єкт в базі даних.
Проте, в деяких випадках необхідним є використання методів
Update() та UpdateRange() відповідно.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні операції з даними. Видалення. Delete
Для видалення використовується метод Remove класу DbSet:

Метод Remove() встановлює значення EntityState в Deleted в якості


стану нового об’єкту. Метод SaveChanges() згенерує запит DELETE для
видалення з відповідної таблиці.
Для видалення декількох об’єктів використовують метод
RemoveRange():

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція.
Entity Framework Core
(EF Core).
Модель даних
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Типи класів моделі в FE Core
Моделювання на основі коду в Entity Framework Core відбувається через два
типи класів.
• Класи об'єктів (сутності), які зберігають дані в оперативній пам'яті. Ви
створюєте властивості навігації в класах сутності, які представляють зв'язки
між класами сутності. Зазвичай це звичайні об'єкти із властивостями для
кожного стовпця бази даних.
• Клас контексту (похідний від DbContext), який представляє модель бази
даних, з кожним із об'єктів, перелічених як DBSet.
В ідеалі ці два типи класів реалізуються в різних проектах (збірки DLL),
оскільки сутнісні класи часто використовуються в декількох або навіть у всіх
рівнях архітектури програмного забезпечення, тоді як контекстний клас є
частиною шару доступу до даних і ним слід користуватися лише при взаємодії
з джерелом даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Співвідношення типів даних при співставленні

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Типи класів моделі в FE Core

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Сутнісні класи моделі в FE Core
За допомогою таких механізмів, як Fluent API і анотації даних 
можна додати додаткові правила конфігурації, або перевизначити
домовленості.
Таким чином, при визначенні моделі можна використовувати
наступні три підходи:
1. Домовленості (conventions).
2. Fluent API.
3. Анотації даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Домовленості
EF Core використовує низку домовленостей для зіставлення класів
моделей з таблицями.
Наприклад, назви стовпців повинні відповідати назвам властивостей,
назви таблиць повинні певним чином відповідати назвам класів, назви
первинних ключів повинні відповідати [НазваКласу]Id, тощо.
В цьому випадку Entity Framework зможе одразу зіставити стовпці
таблиці і властивості моделі.

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


причин не влаштовує розробника.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Fluent API
Fluent API – це набір методів, які визначають зіставлення між
класами і їх властивостями та таблицями і їх стовпцями. Як правило,
функціонал Fluent API використовується при перевизначенні методу
OnModelCreating:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Анотації
Анотації представляють налаштування класів моделей за допомогою
атрибутів. Більшість подібних атрибутів містяться в просторі
System.ComponentModel.DataAnnotations

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Сутності
За замовчуванням усі типи сутностей, для яких визначені в контексті даних
набори DbSet, включаються в модель і надалі зіставляються з таблицями в БД.
Але, крім того, в модель також включаються типи, на які є посилання в
сутності, які вже включені в модель. Наприклад, нехай визначені наступні
сутності та контекст даних:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Сутності
При виконанні міграції в БД буде створено дві таблиці: Books та Categories.
Так як для типу Book визначено набір DbSet, то для імені таблиці буде
використано ім’я цього набору Books, але у визначенні Book використано
Category, тому і для цієї сутності буде створено таблицю. При цьому таблиці
для сутності Magazine створено не буде.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Сутності
Інший спосіб включення сутності в модель надає виклик методу Entity()
об’єкту ModelBuilder в методі OnModelCreating(). Після міграції буде три
таблиці:

Для виключення сутності з моделі існує метод Ignore():

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Сутності
В анотації класу можна задати атрибут [NotMapped]. При цьому буде створено
єдину таблицю Books без поля BookCategory.
Атрибут [NotMapped] може використувуватися і для окремих властивостей
сутностей, які не потрібно відображати в поля таблиці.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Властивості
За замовчуванням модель включає усі властивості, які визначені як
public і відкриті для читання та запису. Для виключення властивості
можна використати анотацію [NotMapped]:
public class Magazine
{
public int Id { get; set; }
[NotMapped]
public string Name { get; set; }
}

або метод Ignore():


modelBuilder.Entity<Magazine>().Ignore(m=>m.Name);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Співставлення таблиць
За замовчуванням кожній сутності відповідає таблиця, назва якої відповідає імені
властивості DbSet<T> в контексті даних. Якщо в контексті потрібна властивість не
визначена, то для назви таблиці використовується ім’я класу сутності.
Атрибут [Table(“Name”)] дозволяє визначати співставлення класу сутності з
таблицею:
[Table("BookType")]
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
Або:
modelBuilder.Entity<Category>().ToTable(“BookType”);
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Співставлення стовпчиків
За замовчуванням кожній властивості відповідає одноіменний стовпчик таблиці.
Атрибут [Column(“Name”)] дозволяє визначати співставлення властивості з
стовпчиком таблиці:
public class Category
{
[Column(“category_id”)]
public int Id { get; set; }
public string Name { get; set; }
}
Або:
modelBuilder.Entity<Category>().Property(n=>n.Id).HasColumnName(“category_id”);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Налаштування ключів
За замовчуванням в якості ключа використовується властивість, яка називається Id
або [Ім’я класу]Id.
Для примусового встановлення властивості в якості ключа за допомогою
анотацій використовується атрибут [Key]:
public class Category
{
[Key]
public int Identif { get; set; }
public string Name { get; set; }
}
Або:
modelBuilder.Entity<Category>().HasKey(u => u.Identif);
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Налаштування ключів з декількох полів
Налаштування складеного ключа:
modelBuilder.Entity<Category>().HasKey(u => new {u.p1, u.p2});
Для призначення назви обмеження для ключа:
modelBuilder.Entity<Category>().HasKey(u => u.Id).HasName(“CatPrimaryKey”);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Налаштування унікальних полів та індексів
Налаштування унікального поля:
modelBuilder.Entity<Category>().IsUnique(u => u.Passport);
Щоб задати назву обмеження для ключа:
modelBuilder.Entity<Category>().HasKey(u => u.Id).HasName(“CatPrimaryKey”);
Для встановлення індексів:
modelBuilder.Entity<Category>().HasIndex(u => u.Passport);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Обмеження
Для задання значення за замовчуванням:
modelBuilder.Entity<Category>().Property(u=>u.Price).HasDeaultValue (100);
Налаштування значення по замовчуванню:
modelBuilder.Entity< Category >().Property(с =>
с.Name).HasDefaultValue(“Програмування”);
Неможливо налаштувати значення стовпців бази даних за замовчуванням,
використовуючи анотації даних.
Обмеження за довжиною:
modelBuilder.Entity<Category>().Property(u=>u.Name).HasMaxLength(25);
або:
[MaxLength(25)]

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Обов’язкові властивості
За замовчуванням властивість є необов'язковою до встановлення, якщо
вона допускає значення null. Це властивості, які мають, наприклад, такі
типи як string, int?, byte[], об'єкти класів і т.д. Хоча ми також можемо
налаштувати ці властивості як обов'язкові.
Для задання, що властивість є обов'язковою, якщо значення null не є для
нього коректним. Ця властивості типів int, decimal, bool і т.д. В базі даних
властивість буде визначено як NOT NULL.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Обов’язкові властивості
modelBuilder.Entity<Book>().Property(b => b.Name).IsRequired();

Анотації:
[Required]
public string Name { get; set; }

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Типи даних
int : int nchar : string

bit : bool ntext : string

char : string numeric : decimal

date : DateTime nvarchar : string

datetime : DateTime real : float

decimal : decimal smallint : short

float : double text : string

money : decimal tinyint : byte


varchar : string

[Column(TypeName = “varchar(100)”)]
modelBuilder.Entity<Category>().Property(u=>u.Name).HasColumnType(“varchar(100)”);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Відношення між моделями
Для зв’язків між моделями в EF Core застосовуються зовнішні ключі і навігаційні
властивості.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Відношення між моделями
За замовчуванням назва зовнішнього ключа повинна мати наступне ім’я:
Ім’я_навігаційної_властивості+Ім’я_ключа_зі_зв’язаної сутності (CategoryId)
Крім того, не обов’язково визначати зовнішній ключ в залежності сутності (в цьому
випадку EF сам автоматично згенерує зовнішній ключ до таблиці Category):

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Відношення між моделями
Крім того, можна задати ключі за допомогою анотації даних:
public partial class Book
{
public int Id { get; set; }
public string BookTitle { get; set; }
public string BookInfo { get; set; }
[ForeignKey("CategoryBookKey")]
public Category Category { get; set; }
public ICollection<AuthorBook> AuthorBook { get; set; }
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Відношення між моделями
Можна задати ключі за допомогою Fluent API:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>()
.HasOne(b => b.Category)
.WithMany(c => c.Books)
.HasForeignKey(b => b.CategoryBookKey);
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Відношення між моделями
На даний момент (версія EF Core 5.0) Entity Framework Core не дозволяє
створювати відношення багато-до-багатьох без сполучної сутності.
Фактично зв'язок багато-до-багатьох тут розбивається на два зв’язки один-
до-багатьох.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Каскадне видалення
Каскадне видалення - це автоматичне видалення залежної сутності після
видалення головної.

За замовчуванням для сутностей застосовується каскадне видалення, якщо


наявність пов'язаної сутності обов'язкова (not null).

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Каскадне видалення
В Fluent API доступні три різних сценаріях, які керують поведінкою
залежної сутності в разі видалення головної :
Cascade: залежна сутність видаляється разом з головною
SetNull: властивість-зовнішній ключ в залежній суті отримує значення null
Restrict: залежна сутність не змінюється при видаленні головної
modelBuilder.Entity<Book>()
.HasOne<Category>(b => b.Category)
.WithMany(c => c.Books)
.OnDelete(DeleteBehavior.Cascade);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Успадковування. Підхід TPH
За замовчуванням при роботі з ланцюжками успадковування класів Entity
Framework Core використовує підхід TPH (Table Per Hierarchy / Таблиця на
одну ієрархію класів).
На даний момент це єдина форма роботи з ієрархіями класів в Entity
Framework Core. При використанні даного підходу TPH для всіх класів з
однієї ієрархії в базі даних створюється одна таблиця. А щоб визначити, до
якого саме класу належить рядок в таблиці, в цій же таблиці створюється
додатковий стовпець - дискримінатор.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Успадковування. Підхід TPH

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Успадковування. Підхід TPH

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Успадковування. Підхід TPH

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Успадковування. Підхід TPH

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Міграції
Якщо ми змінюємо модель, наприклад, додаємо нові властивості,
видаляємо деякі властивості, додаємо анотації даних чи застосовуємо
правила Fluent API, тоді щоб БД прийшла у відповідність з моделями даних,
необхідно заново згенерувати і виконати міграцію.
Для створення міграції у вікні Package Manager Console вводиться
команда: Add-Migration назва_міграції
Назва міграції - довільна назва, головне щоб всі міграції в проекті мали
різні назви

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Створення моделі. Міграції
Після створення міграції її потрібно виконати командою: Update-Database

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
context.Database.EnsureCreate()
context.Database.EnsureCreate () - метод EF, який забезпечує наявність бази
даних для контексту. Якщо вона існує, жодних дій не вживається. Якщо її не
існує, тоді створюється база даних та її схема. Цей метод забезпечує сумісність
моделлю для цього контексту.

Виклик context.Database.EnsureCreate () еквівалентно наступному:


Package Manager Console:
Enable-Migrations -EnableAutomaticMigrations. Add-Migration/Update-Database.
В коді:
Database.SetInitializer CreateDatabaseIfNotExists

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
context.Database.EnsureCreate()
EnsureCreate повністю обходить міграції і просто створює схему бази
даних. Створена цим методом база даних пізніше не може бути
оновлена за допомогою міграцій.
EnsureCreate розроблений для тестування або швидкого
прототипування, коли вас не турбує постійне видалення та повторне
створення бази даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Database.Migrate()
Якщо ви використовуєте міграції та хочете, щоб вони автоматично
застосовувалися під час запуску програми, тоді ви можете
використовувати context.Database.Migrate().
Метод Database.Migrate() застосовує усі міграції для контексту даних.
Створює базу даних, якщо вона не існує.
Виклик context.Database.Migrate() еквівалентно наступному:
Package Manager Console:
Update-Database -TargetMigration

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
Міграція також дуже важлива під час розгортання. Нехай проєкт розробляється
локально, але після розгортання програми база даних також повинна відповідати
новій моделі даних. Оскільки це автоматизовано за допомогою міграцій, вам не
потрібно робити це вручну. Проте, міграція вимагає обережності, неправильна
міграція може зламати вашу програму. Потрібно бути обережним, особливо з
зовнішніми ключами. Це може спричинити винятки з нульовим посиланням.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
ModelSnapshot - це поточний стан моделі, що зберігається у файлі класу з назвою
<YourContext>ModelSnapshot.cs.
Файл додається до папки Migrations при створенні першої міграції та оновлюється при
кожній наступній міграції. Це дозволяє фреймворку міграцій вираховувати зміни,
необхідні для оновлення бази даних до моделі.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Міграція
Файл <YourContext>ModelSnapshot.cs містить знімок поточної схеми. Це клас, який
перекладає вашу модель на схему бази даних. Після створення міграції EF шукає
різницю між моделлю даних та файлом знімків. Він також використовується, коли
потрібно видалити міграцію.
Знімок також важливий для команд. Як що кілька програмістів працюють над однією
моделлю даних. Кожна людина вносить якісь зміни, повинен бути спосіб
синхронізувати відмінності. Проте, неможливо синхронізувати модель і БД постійно,
оскільки існують взаємовиключні сценарії (наприклад, одна людина перейменовує
стовпець, інша людина видаляє його). Іноді все ще потрібне ручне втручання людини.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Шаблон Memento

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Database.EnsureCreate() vs Database.Migrate()
Для використання міграцій існує метод context.Database.Migrate().
Якщо ви не хочете використовувати міграції, а Вам просто потрібно
створити базу даних (зазвичай для тестування), використовуйте
контекст.Database.EnsureCreate() / EnsureDeleted().

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Лекція 5. Робота з даними.
ADO.NET
(LINQ to Entities)
К.Ф.-М.Н., ДОЦЕНТ
КАФЕДРИ ТЕОРІЇ ТА ТЕХНОЛОГІЇ
ПРОГРАМУВАННЯ
ОМЕЛЬЧУК Л.Л.
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
LINQ to Entities. Простий приклад
LINQ до Entities - це частина платформи ADO.NET Entity Framework. LINQ
до Entities дозволяє працювати з об'єктами, які представляють
інформацію з бази даних: шукати, змінювати значення, додавати і
видаляти об'єкти.
private LibraryDataEF.LibraryEntities ctx;

ctx = new LibraryDataEF.LibraryEntities();
ctx.BOOKS.Load();
this.bOOKSBindingSource.DataSource = ctx.BOOKS.Local.ToBindingList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
LINQ to Entities. Простий приклад
//знайти книжку за ідентифікатором 1 {
BOOKS book = (from b in ctx.BOOKS ctx.SaveChanges();
where b.BK_ID == 1 }
select b catch (Exception)
).Single<BOOKS>(); {
//змінити назву книжки throw;
book.BK_NAME = "NEW NAME"; }
//зберегти зміни MessageBox.Show("Назву зниги з ID = 1 змінено
на NEW NAME", "LINQ to Entities");
try
this.dataGridView1.Refresh();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DBContext
private LibraryDataEF.LibraryEntities ctx;

public partial class LibraryEntities : DbContext

Клас об'єкта контексту LibraryEntities (наслідується від DbContext) - це ключ для доступу до
сутнісної моделі даних. Він відповідає за створення і управління з'єднанням з базою даних,
відстежує зміни. Саме клас DbContext з'єднує з базою даних, коли створюється новий
екземпляр LibraryEntities, і цей же клас відстежує зміни, які вносяться в об'єкт клієнта, а
також транслює їх в оператор SQL, який зберігає зміни за викликом SaveChanges методу.
Як правило, використовується клас, успадкований від DBContext, який створюється при
генерації EDM з бази даних. Ім'я класу вибирається на основі імені бази даних - у формі
[База даних]Entities. У наведеному вище коді для бази даних Library передбачений клас
LibraryEntities.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
DBContext
public partial class LibraryEntities : DbContext
{

public virtual DbSet<BOOKS> BOOKS { get; set; }

}
Похідний клас [База Даних]Entities для кожної таблиці бази, обраної при створенні
EDM, матиме властивість DBSet <T>, що представляє таблицю, причому T тут - це тип
сутнісного класу, створеного для подання запису в таблиці. Наприклад, клас
LibraryEntities, використаний в попередньому прикладі, має загальнодоступну
властивість BOOKS типу DBSet<BOOKS>. Вона застосовувалося для виконання запиту
LINQ в попередньому прикладі.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Сутнісні класи Entity
Сутнісні класи в Entity Framework це .NET типи, які представляють
собою відображення на реляційну структуру бази даних.
Платформа Entity Framework дозволяє виконувати складні
відображення між сутнісними класами і реляційними даними, які
можуть охоплювати різні бази даних та бути абстрагованими різними
цікавими способами.
Сутнісні класи в прикладах виявляються за наявністю класів і об'єктів,
що мають імена таблиць бази даних.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Додавання в базу даних
Для виконання вставки необхідно зробити чотири кроки.
1) Перший з них - створення DBtContext. Це перший крок для всіх
операцій LINQ to Entities, і він зустрічається у всіх прикладах.
2) Отримавши контекст, можна створити новий екземпляр сутнісного
типу, наприклад, BOOKS, і наповнити даними його поля.
3) Заповнений сутнісний тип потім додається до DBSet<T>.
4) Останній крок - збереження нових даних за допомогою методу
SaveChanges.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Додавання в базу даних
// 1. Створення DBContext // 3. Додавання сутнісного об'єкта в
таблицю BOOKS
ctx = new LibraryDataEF.LibraryEntities();
ctx.BOOKS.Add(book);

// 4. Виклик метода SaveChanges
// 2. Створення екземпляра сутнісного
об'єкта ctx.SaveChanges();
BOOKS book = new BOOKS // Перевіряємо наявність вставленого
запису
{
var getbook = (from b in
BK_DC = 1, ctx.BOOKS
BK_INFO = "Test info", where (b.BK_NAME == "Test")
BK_NAME = "Test", && (b.BK_DC == 1)
}; select b).FirstOrDefault();

MessageBox.Show("Нову книгу
додано", "LINQ to Entities");
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Додавання в базу даних (спосіб 2)
// 2. Створення екземпляра сутнісного об'єкта ctx.SaveChanges();
BOOKS book = new BOOKS();
book.BK_NAME = "Test2"; // Перевіряємо наявність вставленого запису
book.BK_INFO = "Test2 info"; var getbook = (from b in ctx.BOOKS
book.BK_DC = 1; where (b.BK_NAME == "Test") &&
// 3. Додавання сутнісного об'єкта в таблицю
(b.BK_DC == 1)
BOOKS select b).FirstOrDefault();
ctx.BOOKS.Add(book);

// 4. Виклик метода SaveChanges MessageBox.Show("Нову книгу


додано", "LINQ to Entities");

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Додавання в базу даних (спосіб 3)
// 2. Створення екземпляра сутнісного об'єкта };
BOOKS book = new BOOKS book.DIC_CATEGORIES = dc;
{ // 3. Додавання сутнісного об'єкта в таблицю
BOOKS
BK_INFO = "Test info11",
ctx.BOOKS.Add(book);
BK_NAME = "Test11",
// 4. Виклик метода SaveChanges
};
ctx.SaveChanges();
DIC_CATEGORIES dc = new
DIC_CATEGORIES {
DC_INFO = "info", DC_NAME = "test“

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
Запити LINQ to Entities повертають List<T>.
//знайти усі книжки
List<BOOKS> books = (from b in ctx.BOOKS select b).ToList();
Або
List<BOOKS> books = (ctx.BOOKS.Select(b => b)).ToList();
Або
List<BOOKS> books = new List<BOOKS>();
foreach (BOOKS books2 in (ctx.BOOKS.Select(b => b)))
books.Add(books2);

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
//знайти книжки категорії 1
List<BOOKS> books =
(from b in ctx.BOOKS where b.BK_DC == 1 select b).ToList();
Або
var books =
(ctx.BOOKS.Where(b => b.BK_DC == 1)).ToList();
this.bOOKSBindingSource.DataSource = books;
dataGridView1.Refresh();
Або
var books = new List<BOOKS>();
foreach (var books2 in (ctx.BOOKS.Where(b => b.BK_DC == 1)))
books.Add(books2);

this.bOOKSBindingSource.DataSource = books;
dataGridView1.Refresh();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
//знайти книжки категорії Програмування
List<BOOKS> books = (from b in ctx.BOOKS
where b.DIC_CATEGORIES.DC_NAME == "Програмування"
select b).ToList();
Або
List<BOOKS> books = (ctx.BOOKS.Where(b => b.DIC_CATEGORIES.DC_NAME ==
"Програмування")).ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
/*знайти книжки категорії Програмування. Результат відсортовано за назвою книжки*/
var books = (from b in ctx.BOOKS
where b.DIC_CATEGORIES.DC_NAME == "Програмування"
orderby b.BK_NAME
select b).ToList();
Або
var books = (ctx.BOOKS.Where(b => b.DIC_CATEGORIES.DC_NAME == "Програмування").OrderBy(b => b.BK_NAME)).ToList();
При цьому виконується SQL запит:
SELECT
[Extent1].[BK_ID] AS [BK_ID],
[Extent1].[BK_NAME] AS [BK_NAME],
[Extent1].[BK_INFO] AS [BK_INFO],
[Extent1].[BK_DC] AS [BK_DC],
[Extent1].[BK_qq] AS [BK_qq]
FROM [dbo].[BOOKS] AS [Extent1]
INNER JOIN [dbo].[DIC_CATEGORIES] AS [Extent2] ON [Extent1].[BK_DC] = [Extent2].[DC_ID]
WHERE N'Програмування' = [Extent2].[DC_NAME]
ORDER BY [Extent1].[BK_NAME] ASC

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
//повернення списку назв книг
Базові запити
var booksName = (from b in ctx.BOOKS
where b.DIC_CATEGORIES.DC_NAME == "Програмування"
select b.BK_NAME).ToList();
//проекція
var booksName = (from b in ctx.BOOKS
where b.DIC_CATEGORIES.DC_NAME == "Програмування"
select new
{
NAME = b.BK_NAME,
CATEGORY = b.DIC_CATEGORIES.DC_NAME
}).ToList();
Або
var booksName = (ctx.BOOKS.Where(b => b.DIC_CATEGORIES.DC_NAME == "Програмування").Select(b => new
{
NAME = b.BK_NAME,
CATEGORY = b.DIC_CATEGORIES.DC_NAME
})).ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
//знайти книжки у яких є автор у якого більше однієї книжки
var query1 =
(from b in ctx.BOOKS
from a in ctx.AUTHORS
where ((a.BOOKS.Contains(b))
&& (a.BOOKS.Count > 1))
select b).
ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Базові запити
//знайти книжки у яких є автор у якого більше однієї книжки

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Завантаження пов’язаних об’єктів
Сутнісні типи асоціюються, коли між ними встановлюється відношення
зовнішнього ключа. Сутнісні об'єкти (тобто екземпляри сутнісних типів)
пов'язані один з одним через специфічне значення зовнішнього ключа.
Наприклад, сутнісні типи BOOKS і DIC_CATEGORY з бази даних Library
асоційовані. LINQ to Entities полегшує навігацію за даними, автоматично
відстежуючи асоціацію між ними. Взаємопов'язані об'єкти завантажуються
"за лаштунками", так що код працює прозоро. Однак варто приділити увагу
тому, як завантажуються пов'язані об'єкти.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
"Ледаче" завантаження
"Ледаче" завантаження об'єктів є поведінкою за замовчуванням LINQ до Entities.
Пов'язані об'єкти завантажуються з бази даних, тільки тоді, коли відбувається
звернення до асоційованої властивості сутнісного типу. Те, що не потрібно, ніколи не
завантажується - це називається стратегією оперативного (just-in-time) завантаження.

var books = (from b in ctx.BOOKS


orderby b.BK_NAME select b).ToList();
foreach (BOOKS book in books)
{
var authors = book.AUTHORS.ToList();
//робота з інформацією...
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
"Ледаче" завантаження

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Завантаження пов’язаних об’єктів
У цьому коді запитуються з книги з упорядкуванням результатів по полю
BK_NAME. Потім шукаємо інформацію про авторів, асоційованих з книжками.
Об'єкти авторів, пов'язані з кожною книжкою, не завантажуються, поки не буде
здійснено звернення до поля book.AUTHORS. Коли це робиться, Entity Framework
непомітно запитує базу даних і завантажує необхідні дані. Ніякі інші об'єкти,
пов'язані з типом автора, не завантажуються.
У вищевказаному прикладі, виконується низка згенерованих запитів SQL: один для
отримання списку книжок і по одному для отримання списків авторів для кожної з
книжок. Для деяких проектів така кількість запитів для такого простого шматка
коду буде надлишковою. В наступних слайдах будуть продемонстровані
альтернативні підходи.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Завантаження пов’язаних об’єктів
Для відключиення ледачого завантаження, необхідно встановити опцію в
DBContext, як показано нижче (по замовчуваню true):

ctx.Configuration.LazyLoadingEnabled = false;

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


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

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Негайне завантаження
Коли точно відомо, які дані знадобляться в коді, як це було в попередньому прикладі, можна
в якості частини запиту LINQ to Entities використовувати метод Include для завантаження
пов'язаних сутнісних об'єктів. Метод Include застосовується до запиту зазначенням імені
властивості асоціацію між запитуваною типом і типом, який потрібно завантажити у вигляді
рядка; в даному випадку необхідно викликати метод Include зі строковим аргументом
“AUTHORS".
ctx.Configuration.LazyLoadingEnabled = false;
var books = (from b in ctx.BOOKS
.Include("AUTHORS" )
orderby b.BK_NAME
select b).ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Негайне завантаження

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Негайне завантаження
Скомпілювати і запустити цей перетворений приклад, вийде той же результат, що і у коду з
попереднього прикладу, але в базу даних буде відправлений тільки один запит!
Негайно завантажувати можна скільки завгодно пов'язаних сутнісних типів, застосовуючи
метод Include до кожного необхідного типу.
ctx.Configuration.LazyLoadingEnabled = false;

var books = ctx.BOOKS


.Include("AUTHORS")
.Include("DIC_CATEGORIES")
.Where(b => b.BK_NAME.Length > 5)
.OrderBy(b => b.BK_NAME)
.Select(b => b)
.ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Негайне завантаження

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Явне завантаження
Якщо необхідний повний контроль, то краще за все підійде явне завантаження. Об'єкти
вказуються з використанням методу EntityCollection.Load.
ctx.Configuration.LazyLoadingEnabled = false;
var books = ctx.BOOKS
.OrderBy(b => b.BK_NAME)
.Select(b => b);
// Виконати явне завантаження авторів для кожної книги
foreach (BOOKS book in books)
{
if (book.BK_NAME.Length > 5)
{
ctx.AUTHORS.Load();
}
}

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Оновлення бази даних
Оновлення сутнісних типів полягає в зміні властивостей сутнісного об'єкта та виклику методу SaveChanges
DBContext об'єкта.
var book = (from b in ctx.BOOKS
where b.BK_ID == 1
select b
).Single<BOOKS>();
//змінити назву книжки
book.BK_NAME = "NEW NAME";
//зберегти зміни
try { ctx.SaveChanges(); }
catch (Exception)
{
throw;
}
Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Оновлення асоційованих об’єктів
Entity Framework турбується про керування відносинами між асоційованими типами даних. Ви просто повинні
внести потрібні зміни і викликати метод SaveChanges.
var book = (from b in ctx.BOOKS where (b.BK_ID == 1) select b).FirstOrDefault();
book.BK_INFO = "test test";
var dc = new DIC_CATEGORIES {DC_INFO = "info", DC_NAME = "test"};
book.DIC_CATEGORIES = dc;
// Виклик метода SaveChanges
ctx.SaveChanges();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Додавання асоційованих об’єктів
Entity Framework турбується про керування відносинами між асоційованими типами даних. Ви просто повинні
внести потрібні зміни і викликати метод SaveChanges.
// 2. Створення екземпляра сутнісного об'єкта
BOOKS book = new BOOKS {
BK_INFO = "Test info11",
BK_NAME = "Test11", };
DIC_CATEGORIES dc = new DIC_CATEGORIES {
DC_INFO = "info", DC_NAME = "test“};
book.DIC_CATEGORIES = dc;
// 3. Додавання сутнісного об'єкта в таблицю BOOKS
ctx.BOOKS.Add(book);
// 4. Виклик метода SaveChanges
ctx.SaveChanges();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Видалення записів з бази даних
var book = ctx.BOOKS.Where(b => b.BK_ID == 2006).FirstOrDefault();
ctx.BOOKS.Remove(book);
ctx.SaveChanges();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Керування паралельним доступом
За замовчуванням в Entity Framework використовується модель
оптимістичного паралелізму. Оптимістичність означає те, що вона базується на
припущенні, що ніхто інший не модифікує дані, поки вони використовуються, і
дані зберігаються в базі без проведення перевірки, чи не були вони змінені
кимось іншим.

В базі даних відбуваються усі зміни!!!!

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Керування паралельним доступом
var book = _context.Books string str2 = book.Info;
.Where(b => b.Id == 1) ctx.SaveChanges();
.Select(b => b).FirstOrDefault(); string str3 = book.Info;
string str1 = book.Info; book.Info = "NewTest";
DBLibraryContext ctx = new _context.SaveChanges();
DBLibraryContext();
var book2 = ctx.Books
var book1 = ctx.Books
.Where(b => b.Id == 1)
.Where(b => b.Id == 1)
.Select(b => b).FirstOrDefault();
.Select(b => b).FirstOrDefault();
string str4 = book2.Info;
book1.Info = "TESTBook1";

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму
Перш ніж записати зміни, можна змусити Entity Framework перевірити, чи не
була модифікована база даних кимось іншим. Це також оптимістичний
паралелізм, оскільки в базі даних нічого не блокується, поки робота ведеться з
сутнісними об'єктами, однак при цьому виключається проблема,
продемонстрована вище.
Знадобиться включити перевірку паралельного доступу на рівні поля. Якщо
потрібно, щоб конфлікти паралелізму перевірялися для всіх полів сутнісного
об'єкта, слід переконатися, що відредаговані всі поля.
Для вирішення проблеми, яку можна було бачити в попередньому прикладі,
знадобиться включити перевірку паралельного доступу на поле Info сутнісного
типу Books.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму
Для вирішення проблем паралелелізму Entity Framework Core пропонує
використовувати токен паралелізму (concurrency token).

Якщо властивість встановлено як concurrency token, то Entity Framework перед


тим, як зберегти зміни, буде перевіряти її значення. Якщо значення є відмінним,
то деякий інший користувач вже змінив її значення. У цьому випадку EF Core
застосовує принцип оптимістичного паралелізму (оптимістична паралельність),
при якому, якщо надійні дані вже були змінені, то виникає помилка.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут ConcurrencyCheck
Атрибут ConcurrencyCheck дозволяє вирішити проблеми паралелізму, коли з
одним записом в таблиці, може працювати одночасно декілька користувачів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут ConcurrencyCheck
У звичайному режимі Entity Framework Core при оновленні перевіряє змінну Id і
якщо Id і якщо Id запису в таблиці співпадає з Id в моделі, то рядок в таблиці
оновлюється. При використанні атрибута ConcurrencyCheck EF дивиться не лише
на Id, але і на початкове значення Info. Якщо воно співпадає з тим, що є в таблиці,
то запис оновлюється. Якщо воно не співпадає (хтось вже встиг його успішно
оновити), EF генерує виключення DbUpdateConcurrencyException:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Метод IsConcurrencyToken
В Fluent API токен паралелізму налаштовується методом IsConcurrencyToken():

modelBuilder.Entity<Books>().Property(b => b.Info).IsConcurrencyToken();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут Timestamp
Інший механізм відслідковування змін об'єкта в БД надає атрибут Timestamp.
Атрибут Timestamp вказує, що значення властивості Timestamp буде
включатися у створений Framework Entity Framework SQL-вираз, WHERE при
надсиланні до БД команд на оновлення та видалення даних. Значення цієї
властивості генерується щоразу при додаванні чи оновленні об'єкта. У якості
типу для властивостей використовується масив байтів.
Якщо два користувачі одночасно редагують однин і той самий рядок, то після
збереження моделей з першим користувачем, другий користувач отримає
виключення DbUpdateConcurrencyException.

Замість атрибута можна використовувати Fluent API:


modelBuilder.Entity<Books>().Property(b => b.Timestamp).IsRowVersion();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут Timestamp

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут Timestamp

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Включення перевірок паралелізму. Атрибут Timestamp

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити
var query = (from book in ctx.BOOKS select new
group book by book.DIC_CATEGORIES.DC_NAME {
into g Category = book.DIC_CATEGORIES.DC_NAME,
select new {Category = g.Key, BookCount = BookCount = bookGroup.Count()
g.Count()}).ToList();
}).ToList();
var query1 = (from book in ctx.BOOKS
join cat in ctx.DIC_CATEGORIES on
book.DIC_CATEGORIES.DC_ID equals cat.DC_ID into
bookGroup

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити
var query2 = (from book in ctx.BOOKS
join cat in ctx.DIC_CATEGORIES on var query3 = (from book in ctx.BOOKS
book.DIC_CATEGORIES.DC_ID equals cat.DC_ID
group book by book.DIC_CATEGORIES.DC_ID
where ((book.BK_NAME.Length < 5) &&
(cat.DC_NAME.Length > 5)) into g
select new let a = g.Count()
{
Category = select new {Category = g.Key, BookCount =
book.DIC_CATEGORIES.DC_NAME, a}).ToList();
BookName = book.BK_NAME
}).Distinct().ToList();

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Основні методи
Основні методи, які можна використовувати FirstOrDefault: обирає перший елемент
для створення запитів в Entity Framework: колекції чи повертає значення по
замовчуванню
All: повертає true, якщо усі елементи набору
задовольняють певній умові, інакше - false Single: обирає один елемент колекції, якщо
колекція містить більше чи меньше одного
Any: повертає true, якщо хоча б один елемента, то генерується виключення
елемент набору задовольняє певній умові,
інакше - false SingleOrDefault: обирає перший елемент
колекції чи повертає значення по
Average: підраховує cереднє значення замовчуванню
числових значень в наборі
Select: визначає проекцію обраних значень
Contains: визначає, чи містить набір
визначений елемент Where: визначає фільтр вибірки
Count: підраховує кількість елементів в OrderBy: впорядковує елементи за
наборі зростанням
First: обирає перший елемент колекції OrderByDescending: впорядковує елементи
за спаданням

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити
ThenBy: задає додаткові критерії для Sum: підраховує суму числових значень в
впорядковування елементів за колекції
зростанням
Min: знаходить мінімальне значення
ThenByDescending: задає додаткові
критерії для впорядкування елементів за Max: знаходить максимальне значення
спаданням Take: вибирає певну кількість елементів
Join: з’єднує два набори за певною Skip: пропускає певну кількість елементів
прикметою
TakeWhile: повертає набір елементів
GroupBy: групує елементи за ключем послідовності, доти, доки умова істинна
Except: повертає різницю двох наборів SkipWhile: пропускає елементи в
Union: об’єднує два однорідних набори послідовності, пока вони задовольняють
заданій умові, і потім повертає елементи,
Intersect: повертає перетин двох наборів, що злишилися
тобто ті елементи, які зустрічаються в обох
наборах елементів

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити в EF Core
У випадку складних запитів, іноді виникає потреба напряму вик
Для отримання даних з БД у об'єктів DbSet визначено метод
FromSqlRaw(), який приймає в якості параметра SQL-вираз і набір
параметрів.
Як результат FromSqlRaw повертає набір отриманих з бази даних
об'єктів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити в EF Core

Вираз SELECT отримує дані з таблиці. Так як ця таблиця зіставляється з


моделлю Book і зберігає об'єкти цієї моделі, то в результаті ми
отримаємо набір об'єктів класу Book. До бази даних буде надіслано
наступний запит:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити в EF Core
Ми можемо додавати до методу інші методи LINQ, які всі разом будуть
формувати один загальний SQL-вираз:

До бази даних надійде наступний запит:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити з параметрами
Інша версія методу FromSqlRaw() дозволяє використовувати параметри.
Наприклад, виберемо з бази даних всі книжки, в назві яких є підрядок
«Програмування»:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити з параметрами
До бази даних надійде наступна команда:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити з параметрами
Також ми можемо визначати параметри як звичайні змінні:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
SQL запити з параметрами
До бази даних надійде наступна команда:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити на видалення, оновлення та
додавання рядків
Для видалення, оновлення вже існуючих записів або додавання нових
застосовується метод ExecuteSqlRaw(), який повертає кількість змінених
командою рядків. Для його виклику у контексту даних використовується
властивість Database:

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити на видалення, оновлення та
додавання рядків

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Запити на видалення, оновлення та
додавання рядків
При цьому до БД надходять наступні запити:
exec sp_executesql N'INSERT INTO Category (CatName) VALUES (@p0)',N'@p0
nvarchar(4000)',@p0=N'Фізика‘

exec sp_executesql N'INSERT INTO Category (CatName) VALUES (@p0)',N'@p0


nvarchar(4000)',@p0=N'Нова‘

exec sp_executesql N'SELECT TOP(1) [c].[CategoryID], [c].[CatName]


FROM (
SELECT * FROM Category WHERE CatName = @p0
) AS [c]',N'@p0 nvarchar(4000)',@p0=N'Фізика‘

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
exec sp_executesql N'UPDATE Book SET Book_CatId = @p0 FROM Book WHERE BookTitle
LIKE @p1',N'@p0 nvarchar(4000),@p1
nvarchar(4000)',@p0=N'1008',@p1=N'%Програмування%‘

exec sp_executesql N'DELETE FROM Category WHERE CatName LIKE @p0',N'@p0


nvarchar(4000)',@p0=N'Нова‘

exec sp_executesql N'SELECT [b].[BookId], [b].[Book_CatId], [b].[BookInfo], [b].[BookTitle],


[c].[CategoryID], [c].[CatName]
FROM (
SELECT * FROM Book WHERE BookTitle LIKE @p0
) AS [b]
LEFT JOIN [Category] AS [c] ON [b].[Book_CatId] = [c].[CategoryID]
ORDER BY [b].[BookTitle] DESC',N'@p0 nvarchar(4000)',@p0=N'%Програмування%'

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Методи з інтерполяцією рядків
Для методів FromSqlRaw і ExecuteSqlRaw в EF Core визначені їх двійники
- методи FromSqlInterpolated () і ExecuteSqlInterpolated () відповідно, які
дозволяють використовувати інтерполяцію рядків для передачі
параметрів.

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Методи з інтерполяцією рядків
У цьому випадку на стороні сервера також будуть створюватися
параметри для передачі значень.
exec sp_executesql N'SELECT [b].[BookId], [b].[Book_CatId], [b].
[BookInfo], [b].[BookTitle], [c].[CategoryID], [c].[CatName]
FROM (
SELECT * FROM Book WHERE BookTitle LIKE @p0
) AS [b]
LEFT JOIN [Category] AS [c] ON [b].[Book_CatId] = [c].[CategoryID]
ORDER BY [b].[BookTitle] DESC',N'@p0
nvarchar(4000)',@p0=N'%Програмування%'

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.
Асинхронні методи
Методи Database.ExecuteSqlInterpolated() і Database.ExecuteSqlRaw()
мають асинхронні версії Database.ExecuteSqlRawAsync() та
Database.ExecuteSqlInterpolatedAsync().

Інструментальні середовища та технології програмування к.ф.-м.н., доцент кафедри ТТП Омельчук Л.Л.

You might also like