sql server+c++
.pdfКлючове слово WITH вказує на присутність додаткових опцій. Параметр FILLFACTOR задає значення фактору заповнення лист-
кового рівня індексу (за замовчуванням – 0, тобто повне заповнення). Параметр PAD_INDEX зі значенням ON застосовує значення проценту вільного місця, визначеного у параметрі FILLFACTOR, для
заповнення сторінок проміжного рівня індексу.
Параметр IGNORE_DUP_KEY визначає реакцію на помилку, що виникає при дублюванні значень ключа під час додавання декількох стрічок в унікальний індекс. При значенні ON стрічки, що не дублюють значення індексу, вставляються в таблицю, а дублюючі – відкидаються, але загалом транзакція проходить успішно (сервер видає лише повідомлення). При значенні OFF – сервер видає помилку, та скасовується уся транзакція.
Параметр STATISTICS_NORECOMPUTE вказує чи потрібно обновлювати статистику: ON – автоматичне обновлення статистики відключено, OFF – статистика обновлюється автоматично.
Параметр ALLOW_ROW_LOCKS вказує чи дозволене блокування стрічок: ON – блокування стрічок дозволене при звертанні до індексу, OFF – блокування стрічок не використовується.
Параметр ALLOW_PAGE_LOCKS вказує чи дозволене блокування сторінок: ON – блокування сторінок дозволене при звертанні до індексу, OFF – блокування сторінок не використовується.
Параметр SORT_IN_TEMPDB визначає чи дозволено зберігати тимчасові результати сортування в базі даних tempdb.
Параметр DROP_EXISTING дає можливість видалити існуючий індекс з таким же іменем та побудувати новий: ON – існуючий індекс знищується (не можна використовувати, якщо такий індекс не існує), OFF – генерується помилка, якщо існує індекс з таким же іменем.
Параметр ONLINE вказує чи будуть доступні таблиці та індекси під час роботи сервера з індексом (обновлення, перебудова), чи дані ресурси будуть заблоковані на час операцій сервера з індексом.
Параметр MAXDOP визначає максимальну кількість процесорів, що можуть бути задіяні для розпаралелення операції з індексом.
Для попередньої таблиці Students створимо унікальний індекс на стовпцях Surname, Name та явно задамо порядок сортування за зростанням.
CREATE UNIQUE INDEX IXU_Students_Surname_Name
ON Students (Surname ASC, Name ASC)
WITH (FILLFACTOR = 70, PAD_INDEX = ON)
29
3.5. Додавання стрічок з даними у таблицю.
Для додавання нової стрічки з літеральними константами у таблицю використовується такий спрощений синтаксис:
INSERT [ INTO ]
[<ім’я бази> . [<ім’я схеми>] . | <ім’я схеми> . ] <ім’я таблиці> [ (<назва стовпця >) [ , ... n ] ]
VALUES ( { DEFAULT | NULL | <значення стовпця>} [ , ... n ] )
У такий спосіб за один раз оператором INSERT додається одна стрічка. Тобто, скільки треба вставити стрічок, стільки потрібно й операторів INSERT. Покажемо на прикладі таблиці Client можливі варіанти при додаванні нової стрічки.
Client
ID |
int |
NOT NULL |
|
|
Surname |
nchar(15) |
NOT NULL |
|
|
Country |
nchar(15) |
NULL |
DEFAULT |
'Україна' |
City |
nchar(10) |
NULL |
DEFAULT |
'Львів' |
nvarchar(50) NULL |
|
|
||
|
|
|
|
|
Рис.3.2. Структура таблиці Client
A. Додавання однієї повної стрічки у таблицю.
INSERT INTO Client VALUES (1, 'Павельчак', 'Україна', 'Львів', 'b@m.ua')
Якщо перелік стовпців пропущений, тоді у переліку значення повинні слідувати в тому порядку, в якому стовпці є визначені у таблиці.
INSERT INTO Client (ID, Surname, Country, City, Email)
VALUES (2, 'Ющенко', 'Україна', 'Київ', NULL)
Якщо структура стовпця дозволяє не вводити конкретне значення, тоді замість значення можемо ввести null-значення.
INSERT INTO Client (Surname, City, Country, ID, Email)
VALUES ('Лукашенко', 'Мінськ', 'Білорусія', 3, NULL)
30
Порядок введення значень для стовпців може бути довільним, при умові, що порядок значень у переліку співпадає з порядком слідування стовпців.
Б. Додавання частини стрічки у таблицю.
INSERT INTO Client (ID, Surname)
VALUES (4, 'Самотий')
У переліку стовпців може бути вказана лише частина стовпців. Тоді у переліку значень мають бути вказані лише відповідні для них значення. Решта значень визначаються за замовчуванням, тобто, якщо для стовпця є визначені значення за замовчуванням, тоді присвоюються ці значення, інакше, встановлюється null-значення (якщо null-значення є дозволені).
INSERT INTO Client
VALUES (5, 'Дзелендзяк', DEFAULT, DEFAULT, DEFAULT,)
Якщо у стрічку таблиці вставляється неповний набір даних, і при цьому відсутній список з іменами стовпців, тоді на місцях пропущених даних вписується ключове слово DEFAULT.
В. Додавання стрічки у таблицю, що має автоінкрементне поле.
Student
ID |
int |
IDENTITY (1,1) |
|
Surname |
nchar(10) |
NULL |
|
Name |
nchar(10) |
NULL |
|
|
|
|
|
Рис.3.3. Структура таблиці Student
INSERT INTO Student VALUES ('Цюпа', 'Роман')
При вставці даних значення для автоінкрементного поля встановлюється автоматично, і тому такий стовпець у конструкції INSERT пропускається, незалежно від того, де він розташовується у переліку стовпців. При спробі явно вказати для нього значення – сервер видасть помилку.
31
4. Розроблення клієнтської частини на основі ADO.NET 2.0
4.1. Структура моделі ADO.NET.
Модель ADO.NET є складовою частиною платформи Microsoft
.NET Framework. Тому клієнтську програму розробляють з використанням високорівневих мов C++/CLI, C#, Visual Basic на основі бібліотеки класів .NET Framework, а сама програма виконується в CLRсередовищі. Модель ADO.NET забезпечує взаємодію з різними системами керування базами даних, шляхом використання відповідних їм провайдерів (постачальників даних).
|
|
|
ADO.NET |
|
|
DataSet |
|
SQL Server |
MS SQL Server |
|
|
|
||
|
|
|
провайдер |
|
|
|
|
СКБД |
|
ID |
int |
|
|
|
Name |
char |
|
|
|
Surname char |
|
|
||
IDg (FK) int |
|
Oracle |
|
|
|
|
|
Oracle |
|
|
IDg |
int |
провайдер |
|
|
Group |
char |
|
СКБД |
|
|
|
|
|
|
|
|
OleDb |
OleDb-сумісна |
Програма-клієнт |
|
провайдер |
||
|
СКБД |
|||
|
|
|||
|
|
|
|
|
|
|
|
ODBC |
ODBC-сумісна |
|
|
|
провайдер |
|
|
|
|
СКБД |
|
8 |
|
|
|
|
|
|
|
|
|
Рис. 4.1. Структура організації взаємодії клієнта з СКБД |
Модель ADO.NET умовно поділяється на дві групи об’єктів: під’єднані та від’єднані (на рис. 4.1 вони розділені вертикальною штриховою лінією). Під’єднані об’єкти, що представляють відповідний провайдер, безпосередньо взаємодіють з БД та використовуються для керування з’єднанням, транзакціями, для вибірки даних та передачі відповідних змін у БД. Від’єднані об’єкти дають можливість працювати з даними автономно і від вибору провайдера не залежать. Мостиком між цими двома групами об’єктів є об’єкт DataAdapter.
32
Кожен провайдер реалізує однакові базові класи, які відрізняються лише префіксами: Sql, Oracle, OleDb, Odbc. Наприклад, для Sql Client .NET Data Provider це такі:
SqlConnection |
З’єднує програму з базою даних SQL |
|
Server. |
SqlConnectionStingBuilder |
Клас конструктора стрічок підключення |
|
для об’єктів SqlConnection. |
SqlCommand |
Представляє SQL-оператор чи збережувану |
|
процедуру для виконання через поточне |
|
з’єднання SqlConnection. |
SqlParameter |
Представляє параметр, що використовуєть- |
|
ся об’єктом SqlCommand. |
SqlDataReader |
Дає програмі доступ до даних у режимі |
|
послідовного читання. |
SqlTransaction |
Керує транзакціями в базі даних. |
SqlDataAdapter |
Використовує об’єкт SqlCommand для |
|
переміщення даних між базою даних та |
|
об’єктами DataSet. |
* Дані класи розміщуються в просторі імен System::Data::SqlClient .
Клас SqlConnection представляє з’єднання з джерелом даних. За допомогою властивостей цього об’єкта можна задати тип джерела, його розташування та інші атрибути. Об’єкт SqlConnection застосовується для з’єднання з БД та від’єднання від неї. Він виступає в якості каналу, по якому інші класи, наприклад SqlDataAdapter та SqlCommand, взаємодіють з БД для передачі змін та вибірки їхніх результатів. Його найважливішим параметром є ConnectionString (стрічка підключення).
Стрічка підключення складається з набору пар ім’я-підклю- чення, розділених за допомогою крапки з комою. Її параметри та значення залежать від того, з яким джерелом даних необхідно з’єднатися, а також за допомогою якої технології виконується з’єднання.
Наприклад, при використанні доступу до БД за допомогою інтегрованої безпеки Windows Authentication стрічка виглядатиме так:
Data Source = .\SQLEXPRESS; Initial Catalog = KSA;
Integrated Security = True
33
Параметр Data Source визначає ім’я сервера та складається з двох частин, розділених зворотною косою рискою. Зліва вказується ім’я комп’ютера, справа – назва іменованої копії SQL Server 2005. Ім’я локальної машини можна задати за допомогою спеціальних значень
(local), localhost або . (крапка).
Параметр Initial Catalog визначає назву бази даних на сервері. Параметр Integrated Security вказує, що у стрічці підключення
використовується інтегрована безпека.
Якщо необхідно використовувати доступ до сервера за паролем, тоді стрічка виглядатиме так:
Data Source = .\SQLEXPRESS; Initial Catalog = KSA;
User ID = sa; Password = 1
де параметр User ID визначає логін користувача на сервері, а Password визначає пароль доступу.
Перелік деяких параметрів стрічки підключення.
Data Source
-або -
Server
-або -
Address
-або -
Addr
Initial Catalog
- або -
Ім’я чи мережева адреса екземпляра SQL Server, до якого здійснюється підключення.
Ім’я бази даних.
Database
Integrated Security
- або -
Trusted_Connection User ID
Password
- або -
Pwd
Connect Timeout
- або -
Connection Timeout
Дозвіл на використання інтегрованої схеми безпеки доступу до БД (за замовчуванням – false).
Логін користувача SQL Server.
Пароль доступу до SQL Server, згідно вказаного логіна користувача. Не рекомендується використовувати разом з параметром
Integrated Security = True
Тривалість (в сек) очікування з’єднання зі сервером, після чого генерується помилка (за замовчуванням – 15 сек).
34
Encrypt |
Визначає, чи канал обміну даними між клієнтом |
|
та сервером буде шифруватися (за замовчуван- |
|
ням – false). |
Max Pool Size |
Визначає максимальну кількість дозволених |
|
з’єднань у пулі (за замовчуванням – 100). |
Min Pool Size |
Визначає мінімальну кількість з’єднань у пулі |
|
(за замовчуванням – 0). |
Pooling |
Вказує, що з’єднання слід вибрати з пулу, якщо |
|
воно там існує (за замовчуванням – true). |
|
|
Об’єкти SqlCommand дають можливість виконувати різноманітні SQL-запити до бази даних. Одні з них повертають дані у вигляді набору результатів, інші змінюють структуру бази даних. Основні його параметри це:
–Connection містить назву об’єкта SqlConnection, за допомогою якого відбувається з’єднання з базою даних;
–CommandText містить стрічку з SQL-запитом.
Об’єкти SqlCommand підтримують параметризовані запити. Це дає можливість користувачу задавати значення параметрів для запитів безпосередньо в програмі, і водночас запобігає некоректних вставлень у SQL-запити. Позначаються параметри символом «at» (@).
SELECT * FROM Students WHERE ID = @ID
Параметри можуть використовуватися як для передачі значень у БД, так і отримання їх звідтіль. Для виконання параметризованого запиту в об’єктній моделі ADO.NET необхідний параметр SqlParameter має бути доданим у колекцію Parameters об’єкта SqlCommand.
Клас SqlDataAdapter виконує роль моста між з’єднаними та від’єднаними рівнями об’єктної моделі ADO.NET. За допомогою об’єкта SqlDataAdapter вдається перемістити дані з БД в об’єкт DataSet, а також прийняти обновлення з кешу DataSet та передати в БД (рис. 4.2).
Об’єкт DataSet |
|
Адаптер даних |
База даних |
|
|
|
|
Рис. 4.2. Адаптер даних у ролі моста між БД та DataSet
35
Об’єкт DataSet представляє собою реляційну програмну модель бази даних, що розміщується в оперативній пам’яті. Клас DataSet складається з колекцій таблиць DataTable, які можуть бути зв’язані між собою за допомогою об’єктів класу DataRelation. Крім того, для забезпечення цілісності даних у класі DataSet можуть бути викорис-
тані об’єкти UniqueConstraint та ForeignKeyConstraint.
Для полегшення роботи з об’єктами DataSet у середовищі .NET Framework передбачено генерування строго типізованих DataSet на основі XML-схеми. Цей клас генерується на основі звичайного DataSet і має вдосконалені властивості та методи, які визначаються XML-схемою. Зазначимо, що для роботи зі строго типізованими
DataSet, необхідно писати XSD-схеми (XML Schema Definition). У
більшості випадках Visual Studio дає можливість дуже легко створювати строго типізовані об’єкти DataSet та автоматично генерувати для них XSD-схеми. Однак, при внесенні змін у БД необхідно перебудовувати XSD-схему.
Далі у прикладі ми проілюструємо процес створення клієнтської програми з використанням строго типізованого об’єкта DataSet.
4.2. Модель БД для розроблюваного прикладу клієнта.
Для ілюстрації прикладу розроблення клієнтської програми ми створимо на локальному сервері базу даних KSA з такою структурою:
Рис. 4.3. Структура бази даних KSA
36
4.3. Проектування клієнта.
4.3.1. Новий проект + XSD-схема бази даних.
У середовищі Visual Studio 2005 створимо новий CLR-проект програми Windows Forms під назвою «KSA» (див. інструкцію [16]).
Далі, скориставшись функціями доступу до даних Visual Studio, додамо нове джерело даних. Для цього виберемо пункт меню Data → Add New Data Sourse (рис. 4.4).
1
Рис. 4.4. Додавання нового джерела даних у Visual Studio 2005
У першому вікні майстра (рис. 4.5) з’явиться запитання, який тип даних слід створити. Виберіть елемент Database та натисніть кнопку Next.
2
3
Рис. 4.5. Додавання нового джерела даних у Visual Studio 2005
На наступному кроці майстер Data Source Configuration запропонує вибрати тип підключення до бази даних. Якщо раніше у Visual
37
Studio вже здійснювалися підключення до баз даних, то ці підключення будуть відображені у переліку, і можна буде скористатися одним із них. У нашому випадку, ми створимо нове підключення і для цього натиснемо кнопку New Connection… (рис. 4.6).
4
Рис. 4.6. Вибір підключення
Поверх попереднього з’явиться діалогове вікно Add Connection
5
6
7 |
|
8 |
9 |
|
Рис. 4.7. Вибір з’єднання з локальним екземпляром SQL Server
38