МІНІСТЕРСТВО ОСВІТИ УКРАЇНИ
ДЕРЖАВНИЙ УНІВЕРСИТЕТ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
кафедра Програмного Забезпечення
М Е Т О Д И Ч Н І В К А З І В К И
“ПРОГРАМУВАННЯ НА C#”
до лабораторних робіт з дисципліни
«Об’єктно– орієнтоване програмування»
Для базового напрямку 6.0804 "Комп’ютерні науки"
ЗАТВЕРДЖЕНО
на засіданні кафедри
програмного забезпечення
протокол № 1
від “30 “ серпня 2007 р.
Львів – 2007
Методичні вказівки “ПРОГРАМУВАННЯ НА C#” до лабораторних робіт з дисципліни "Об`єктно– орієнтоване програмування" для базового напрямку 6.0804 "Комп’ютерні науки" / Укл. Р.А.Мельник, М.М.Сенів. – Львів: Видавництво Національного університету "Львівська політехніка" – 39с.
Укладачі: Мельник Р.А., д-р техн.. наук, професор
Сенів М.М., асистент
Відповідальний за випуск: Федасюк Д.В., д-р техн.. наук, професор
Рецензенти: Семотюк В.М., канд. техн. наук, доцент,
Пелешко Д.Д. канд. техн. наук, доцент.
Методичні вказівки містять матеріал для створення програм з механізмами керування потоками, доступу до баз даних, розбки веб сторінок. Лабораторні роботи присвячено пакетам, що містять інструментарій для створення програм для роботи в комп’ютерних мережах, зокрема, підтримки клієнт – серверних з’єднань (Net), реалізації механізмів доступу до віддалених баз даних (ADO.NET). Всі роботи завершуються контрольними запитанням та завданнями.
.
Лабораторна робота №1
Тема: ЗАСОБИ СТВОРЕННЯ C#-ПРОГРАМ
Мета: навчитись користуватись середовищами розробки програм мовою C#, а також засвоїти склад пакетів бібліотеки різних інструментальних засобів
Вступ
Для розробки програм на платформі .NET компанія Microsoft розробила ряд інструментальних засобів, серед яких виділяється продукт Framework Software Development Kit (SDK), аналогічний до JDK від компанії Sun. Він включає платформу .NET і всі необхідні інструменти для розробки, компіляції та тестування (в тому числі документацію, приклади тощо).
Для використання SDK необхідно мати одну з наступних операційних систем :
Microsoft Windows NT 4.0 ,
Microsoft Windows 2000 ,
Microsoft Windows XP Professional ,
а також навігатор Microsoft Internet Explorer 5.01 чи пізніші.
Середовише Visual Studio .NET
Другим важливим інструментальним продуктом є Visual Studio .NET (VS.NET), що містить в собі платформу .NET (рис.1.1). При наявності даного середовища нема необхідності окремої інсталяції SDK.
Рис.1.1. Архітектура Visual Studio .NET
Розглянемо деякі складові середовища розробки Visual Studio .NET :
Конфігурування опція "My profile" ("Start Page"), дає можливість вибрати відповідну конфігурацію середовища : клавіатуру, планування видимих вікон на спільній формі, конфігурація системи допомоги та початкова сторінка на початку роботи, мова програмування тощо.
Початкова сторінка при запуску VS.NET відповідає "Get Started" (рис.1.2) Тут видно назви файлів останніх проектів, а також приклади, присутні у VS.NET. Оскільки певні вікна використовуються у зазначених випадках, тому їх стан можна позначити як "авто-схову". Тоді вони не займають місця форм, які часто використовується. Цей початковий стан фіксується в лівій частині монітора ("Server Explorer" та "Toolbox"). Стан "авто-схову" можна встановити вибором відповідної опції контекстного меню, що з’являється на панелях назв вікон, а також кнопкою пін форми, яка з’являється біля кнопки для закриття вікна.
Рис.1.2. Стартова сторінка середовища VS.NET
На стартовій сторінці є меню посилань:
"Headlines" - (при підключенні до Інтернету) дозволяє переглядати останні новини з VS.NET;
"Online Community" - переглядати приклади програм та нові розробки на платформі .NET;
"Search Online" - Вести пошук інформації в бібліотеках мережі розробників Microsoft (MSDN Library);
"Downloads" - завантажувати потрібні файли;
"XML Web Services" - переглядати жовті сторінки та публікувати програми .NET в мережі.
В пункті "Get Started" з’являться останні проекти, з якими працював програміст, а також приклади, що були занесені при інсталяції середовища.
Персоналізація середовища Опція "Customize" меню "Tools" (рис.1.3) дозволяє налаштовувати набори меню та кнопок для керування середовищем VS .NET.
Рис.1.3. Вікно налаштування середовища VS.NET
Налаштування VS.NET здійснюється опцією "Options" в меню "Tools". До елементів найважливіших можна віднести:
Оточення (рис.1.4) має пункт загальної ("general") візуалізація документів та початкове налаштування середовища, опції керування файлами ("documents"), в тому числі для використання файлів, що змінювались поза середовищем; шрифти, кольори ("fonts and colors"); допомога ("help" та "dynamic help"), конфігурація клавіатури ("keyboard") тощо.
Рис.1.4. Вікно налаштування середовища VS.NET
Перегляд коду (Source control) дозволяє контролювати версії програм та перевіряти правильності внесених змін.
Visual Studio .NET має декілька допоміжних інструментів для прискорення проектування програм при їх розробці :
Провідник рішень (Solution Explorer) дозволяє мати доступ до різних компонент проекту та їх властивостей для здійснення модифікацій над ними (рис.1.5).
Рис.1.5. Вікно Провідника рішень VS.NET
Провідник класів (Class View) має два вікна (ри.1.6) для демонстрування класів проекту, їх членів та ієрархічної структури успадкування. В процесі написання програми програміст користується цими вікнами.
Рис.1.6 Вікно провідника класів VS.NET
Список завдань (Task List – рис. 1.7 ) вказує на чергу завдань на виконання (позначених як "TODO"). Виклик програми-майстра ("wizards") зобов’язує пам’ятати, що додається до даного списку. Помилки і повідомлення компілятора також появляються у цьому списку. Опцією "Add Task List Shortcut" контекстного меню редактора тексту можна додати посилання на певні частини документу .
Якщо завдання зі списку пов’язане з файлом, то подвійним кліком (натисканням) здійснюється перехід на файл.
Рис. 1.7. Вікно списку завдань VS.NET
Навігатор об’єктів (Object Browser) ) дозволяє проглядати простори назв, класи, структури, інтерфейси та інші компоненти проектів, а також зовнішні компоненти, на які в даному проекті є посилання ( рис.1.8).
Рис.1.8 Навігатор об’єктів у середовищі VS.NET
Командне вікно дозволяє проглядати IDE (інтегроване середовище розробки) (рис.1.9) в командному рядку та визначати псевдонім для скорочення написання команд (наприклад, Alias замість View.ObjectBrowser).
Рис.1.9 Командне вікно у середовищі VS.NET
Редактор тексту (Text editor) потрібен для створення текстів різними мовами програмування. Редактор містить функції покрокового пошуку (CTRL+I), багатовимірну кишеню ("clipboard ring" - CTRL+SHIFT+V), вибору стовпців (вибір мишкою та натискання клавіші ALT), нумерації рядків, зміни кольору тощо.
Додаткові можливості середовища VS.NET полягають в можливості позначення областей коду для їх групування за функціями. Це спрощує аналіз роботи програми, бо фрагменти ховаються і висвітлюються на вимогу користувача. Групи коди позначаються директивою #region :
#region "region of the code "
...
#endregion
Макроси VS.NET дозволяють користувачеві персоніфікувати та автоматизувати виконання завдання (проекти, редактор коду, вікна інструментів, компіляція, відлагодження програми тощо ).
Підменю “Macros” опції “Tools" містить позицію 'Record TemporaryMacro' для фіксації дій, що призначаються для кнопки 'Stop Recording' .
Дії макроса також можна прив’язати до певних комбінацій клавіш ("Tools | Options | Environment | Keyboard") як і додати їх до списку меню чи планки функцій VS.NET.
Допомога надається у вигляді довідки при натисканні клавіша F1. Текст фільтрується згідно встановленої для середовища конфігурації. Змінити властивості фільтра можна опцією "Edit Filters" в меню "Help".
2. Вказівки до виконання роботи
Дослідити функції текстових редакторів середовищ.. Ознайомитсь з елементами візуального програмуванння. Визначити номер версії та склад бібліотек C#.
3. Послідовність виконання роботи
Розробити текст вхідного файлу;
Виконати компіляцію;
Створити візуальні структури для виводу результатів роботи, час роботи;
Виконанти відлагодженння.
4.Завдання до лабораторної роботи
Оцінити можливості кожного з середовищ.
Виконати порівняльний аналіз відомих засобів.
5 Контрольні питання
Вказати основні принципи побудови платформи .NET.
Вказати головні компоненти платформи .NET.
Який механізм використовується в платформі для зв’язування різномовних програм?
Зобразити графічно складові середовища програмування.
Пояснити призначення інструментів середовища програмування.
Пояснити склад збірки в платформі .NET.
Пояснити функції редактора текстів.
Які і для яких цілей призначені вікна середовища VS?
На які групи можна поділити класи та інтерфейси платформи .NET?
Чим платформа .NET відрізняється від традиційного програмування для С++ ?
На противагу якій платформі компанія MS розробила платформу .NET і чому?
Лабораторна робота №2
Тема: класи , об’єкти та простори іменв в С#.
Мета: освоїти елементи програмування мовою C# при розробленні класів та методів C#.
Вступ
Усі класи в мові С# успадковуються від класу Object. Тому об'єкти породжених класів можуть використовувати методи цього класу. Клас Object - це корінь дерева наслідування. С# не має класів-"сиріт": всі класи, крім Object, мають попередника.
Побудова аплетів Класи та об’єкти
Для створення класів використовується ключове слово class. Клас є шаблоном для створення об'єктів. Він може містити дані і методи. Для позначення наслідування використовується знак двокрапки (:) , наприклад
class FootballGame : Competition { ...}
Ключове слово this використовується як посилання на об'єкт даного класу, в тому числі на його змінні у методах :
class Person
{
string name;
public Person (string name)
{
this.name = name;
}
public void Presents (Person p)
{
if (p != this)
Console.WriteLine("Hello, I’m " + name);
}
}
static void main()
{
Person p1 = new Person (John);
Person p2 = new Person (Mary);
p2.presents(p1);
}
Результатом програми буде слово Mary
Є різні режими доступу до даних та методів класу: private - методам тільки даного класу, protected – методам даного і породжених класів, public – методам різних класів, internal - методам даної збірки, protected internal – методам даного і породжених класів і даної збірки. Якщо режим доступу опущений, передбачається, що відповідний елемент доступний у межах пакета. В мові С# усі методи повинні бути визначені всередині визначення класу.
Дані класу формують його властивості, наприклад, в класі маємо
public class Shoe {
private int mSize; // поле властивості
public int Size { get { return mSize; } set { if (value < 0) //ключове слово value завжди ідентифікує нове значення mSize = 0; else mSize = value; }
}
}
Shoe s=new Shoe( ); // створення об’єкту
s.Size= -25; // буде занесено 0 у поле mSize
Як видно з прикладу оператор (метод-аксесор) set дозволяє контролювати правильність введених значень.
Ініціалізація об'єкта здійснюється відповідним конструктором. Ці операції не можна розділити – оператор new передує роботі конструктора. Конструктори можуть перевантажуватись, як це продемонстровано у наступному прикладі:
class SuperHero { private int mLevel; public SuperHero() { // Конструктор без параметрів mLevel = 0; } public SuperHero(int level) { // Конструктор з параметром this.mLevel= level; }
public int Level { get { return mLevel; } set { mLevel = value; } //ключове слово value ідентифікує нове значення }Для завершення програми використовуються деструктори, які повинні містити команди
звільнення ресурсів :
~SuperHero() {
. . . . . . . . // команди звільнення ресурсів
. . . . . . . . // створення методу Finalize() }
Розглянемо приклади формування об’єктів:
SuperHero hero = new SuperHero(3); SuperHero hero2 = hero; // Два посилання на один об’єкт Console.WriteLine(hero.Level); // Друкує 3
hero = null ; // Звільнення об’єкту
if (hero == null) hero = new SuperHero();
Object obj = new SuperHero();
Console.WriteLine("object's type: " +obj.GetType().ToString());
Подібно як файли організовані в каталогах типи даних в мові С# (зокрема і класи) організуються в просторах назв (Namespace). Часто вживані класи об’єднані в просторі System. Відповідальні за доступ до даних – у System.Data, за операції введення/виведення - у System.IO, і т.д. Простори назв дозволяють використовувати різні класи з однаковими назвами, що належать до різних просторів.
Простори назв дозволяють ідентифікувати конкретний тип. Між просторами назв та файлами не існує ніякого зв’язку.
Інструкція Namespace передує файлові з вхідним С#-текстом. Вона скорочує довжину назви класу, що викликається (в коментарях наведені повні назви):
namespace N1 { // N1
class C1 { // N1.C1
class C2 { // N1.C1.C2
}
}
namespace N2 { // N1.N2
class C2 { // N1.N2.C2
}
}
}
Об’єкти імпортуються з допомогою інструкції using, яка дозволяє зменшити довжини назв :
using N1;
C1 a; // повна назва N1 C1.
N1.C1 b; // повна назва
C2 c; // помилка, C2 не визначено в N1
C1.C2 e; // повна назва N1.C1.C2 e;
N1.N2.C2 d; // C2 з простору N2
Інструкція дозволяє формувати псевдоніми ( alias):
using C1 = N1.N2.C1;
using N2 = N1.N2;
C1 a; // замість N1.N2.C1
N2.C1 b; // замість N1.N2.C1
Можливі дві форми запису :
namespace Harding.Compsci.Graphics { ...}
або
namespace Harding { namespace Compsci { namespace Graphics { ... } }}
Виклик об’єктів з цього простору здійснюється інструкцією:
using Harding.Compsci.Graphics;
Загальні коментарі в C# мають С-подібний стиль :
// однією лінійкою/* кратними
лінійками */
Спеціальними коментарями можна вважати тексти , пов’язані з XML форматуванням, які опрацьовуються компіляторами:
/// XML коментарі однією лінійкою/** XML коментарі
Декількома лінійками */
3. Вказівки до виконання роботи
Скласти структуру класу. Побудувати структури даних та вибрати типи даних. Вибрати класи та пакети, необхідні для програмуванння конкретної програми.
4. Послідовність виконання роботи
Розробити механізм сценарію;
Спроектувати методи класу;
Формалізувати алгоритм;
Створити візуальні структури .
Завдання до лабораторної роботи
Створити C# програму декілька кульок, що рухаються на площині.
Створити C# програму : формування графів.
.Створити C# програму введення та перетворенння даних.
Створити C# програму генерацій та опрацювання псевдо випадкових послідовностей
6. Контрольні питання
1 Створити клас, метод main якого роздруковує дані з двовимірного масиву.
Створити клас, метод main якого методом половинного ділення відрізка знаходить значення кореня функції. Проміжні значення наближень зберегти в масиві та роздрукувати. Використати подвійну точність.
Створити клас Line, який містить метод малювання лінії (на основі координат двох точок, ширини лінії та кольору).
Створити клас Triangle, який містить метод малювання трикутника (на основі координат трьох точок, ширини ліній та кольору) та який використовує об’єкти типу Line.
Для геометричних фігур: квадрата, трикутника і кола знайдіть спільні властивості, створіть клас базовий та три класи похідні.
Створити клас Translator на основі об’єкту класу Table для зберігання англо-українського словника (англійське слово – українське слово). Основні два методи класу setWords getWord призначені для занесення пари слів та отримання перекладу.
Лабораторна робота №3
Тема: побудова програм потоків за допомогою стандартних бібліотек C#.
Мета: освоїти елементи програмування мовою C#, а також засвоїти класи і методи графічної бібліотеки awt (swing).
Вступ
Сучасні операційні системи підтримують багатопотоковий режим, в якому програміст в межах кожного процесу може створювати декілька підпроцесів або потоків. Потоки відрізняються від процесів. В системі з малою кількістю потоків є самостійні процеси і зв’язані процеси, які спільно використовують програми опрацювання відкритих файлів. В багатопотоковій системі кожен процес складається з одного чи більше (до n) потоків, і всі вони спільно використовують як глобальні змінні, так і програми опрацювання відкритих файлів. Таке розділення глобальних змінних спрощує для потоків спільне використання ресурсів при одночасному виконанні поставлених їм задач.
1. Потоки в C#
представляє системний потік. Потоки запускаються з допомогою механізму делегата, тобто об’єкту, який вказує на метод, що має бути запущений. Метод для делегата вказується без аргументів і він служить точкою входу у потік. Початковий стан потоку необхідно встановити в об’єкті, що містить делегата.
Етапи створення потоку є наступні:
. . . . . . . . . . . .
//1. Створення об’єкту, що буде виконуватись у потоці (вхід у потік)
Pulsar pulsar = new Pulsar();
// 2. Занесення початкових параметрів об’єкту
pulsar.parameter= 1234;
// 3. Створення делегата (точки входу) з назвою об’єкта для його конструктора
ThreadStart threadStart = new ThreadStart(pulsar.Run);
// 4. Створення потоку з передачею йому відповідного делегата
Thread thread = new Thread(threadStart);
// 5. Виконання потоку відповідного об’єкту
thread.Start();
// ...
thread.Join();
// 6. Очікувати завершення виконання потоку
thread.Sleep(2000);
Делегат ThreadStart є частиною простору назв System.Threading і не приймає аргументів та не повертає ніяких даних (версія NET 1.0).
Делегат ParameterizedThreadStart (версія NET 2.0) дозволяє передавати один параметр типу System.Object та повертає void.
Розглянемо приклад у вигляді класу Printer :
public class Printer
{
//зауважимо, що метод друку не має параметрів
public void PrintNumbers()
{
//функція надання інформації про потік Thread
Console.WriteLine("-> {0} is executing PrintNumbers()",
Thread.CurrentThread.Name);
// Друк чисел і затримка виконання потоку
Console.Write("Your numbers: ");
for(int i = 0; i < 10; i++)
{
Console.Write(i + ", ");
Thread.Sleep(2000);
}
Console.WriteLine();
}
// головна програма створює декілька потоків
static void Main(string[] args)
{
Console.WriteLine("** The Amazing Thread App **\n");
Console.Write("Do you want [1] or [2] threads? ");
// занесення кількості потоків в змінну threadCount
string threadCount = Console.ReadLine();
// Назва наявного потоку
Thread primaryThread = Thread.CurrentThread;
primaryThread.Name = "Primary";
// друк про головний потік
Console.WriteLine("-> {0} is executing Main()",
Thread.CurrentThread.Name);
// Створення робочого об’єкту.
Printer p = new Printer();
switch(threadCount)
{
case "2":
// Створення нового потоку на основі делегата та методу виклику
Thread backgroundThread =
new Thread(new ThreadStart(p.PrintNumbers));
backgroundThread.Name = "Secondary";
// старт потоку з методом p.PrintNumbers
backgroundThread.Start();
break;
case "1":
// виконання методу p.PrintNumbers у головному потоці
p.PrintNumbers();
break;
default:
Console.WriteLine("Sorry...you get 1 thread.");
break;
}
// Виконання певної роботи
MessageBox.Show("Work on main thread...");
Console.ReadLine();
}
}
Наступний приклад ілюструє використання делегата, який дозволяє передачу параметрів для метода об’єкту потоку ( ParameterizedThreadStart ).
Розглянемо клас об’єкту:
class AddParams
{
public int a;
public int b;
public AddParams(int numb1, int numb2)
//конструктор заносить два числа
{
a = numb1;
b = numb2;
}
// метод приймає параметром об’єкт AddParams сумує значення та друкує результат
public static void Add(object data)
{
if (data is AddParams)
{
Console.WriteLine("ID of thread in Main(): {0}",
Thread.CurrentThread.GetHashCode());
AddParams ap = (AddParams)data;
Console.WriteLine("{0} + {1} is {2}",
ap.a, ap.b, ap.a + ap.b);
}
}
//текст головної програми містить делегата ParameterizedThreadStart
static void Main(string[] args)
{
Console.WriteLine("** Adding with Thread objects **");
Console.WriteLine("ID of thread in Main(): {0}",
Thread.CurrentThread.GetHashCode());
// Створення об’єкту для потоку
AddParams ap = new AddParams(10, 10);
// Створення потоку через створення делегата з передачею метода
Thread t = new Thread(new ParameterizedThreadStart(Add));
// стартуванння потоку з передачею параметра ap
t.Start(ap);
...
}
}
Потоки є механізмом створення неперервних та конкуруючих процесів. Якщо у попередньому класі Printer введемо в методі друку PrintNumbers() затримку випадкової тривалості, то процес потоку, в якому виконується метод, буде затримуватись. Якщо потоків буде декілька, вони будуть конкурувати між собою за доступ до друку.
public class Printer
{
public void PrintNumbers()
{
...
for (int i = 0; i < 10; i++)
{
Random r = new Random();
Thread.Sleep(1000 * r.Next(5));
Console.Write(i + ", ");
}
Console.WriteLine();
}
}
Головна програма формує конкуруючі потоки:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("*****Synchronizing Threads *****\n");
Printer p = new Printer();
// Створити 10 потоків з одним методом одного об’єкту
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++)
{
threads[i] =
new Thread(new ThreadStart(p.PrintNumbers));
threads[i].Name = string.Format("Worker thread #{0}", i);
}
// Стартувати всі наявні потоки
foreach (Thread t in threads)
t.Start();
Console.ReadLine();
}
Наведені потоки можуть належати до:
переднього плану - програма не закривається поки не завершаться всі її потоки переднього плану;
заднього плану (daemon threads) - потоки автоматично знищуються при розвантаженні програмної області (властивість IsBackground=true).
2. Вказівки до виконання роботи
Ознайомитись з механізмом потоків. Скласти алгоритм простого потоку.. Запустити потік. Ускладнити задачу з нарощеннням кількості потоків.
3. Послідовність виконання роботи
Розробити механізм потоку;
Спроектувати клас потоку для задачі малюванння та переміщення об'єктів;
Формалізувати алгоритм. Розробити структури даних;
Створити візуальні структури .
4.Завдання до лабораторної роботи
Створити C# потоки кульок.
Створити C# потоки видруку різних слів.
Створити C# потоки декількох годиннніків.
Створити клас потоку TicTac, який в методі run містить цикл виводу слова (першого параметра конструктора) і робить затримку на час, що задається другим параметром конструктора. Запустити 2-3 потоки з різними словами та затримками. Проаналізувати результати.
Створити клас потоку Movie, який в методі run містить код малювання ліній, фігур, зображень з файлу тощо. Вхідними параметрами потоку встановити координати центру, час затримки або інші атрибути малюнків. Запустити декілька потоків щоб їх робота відображала рух об’кта по екрану.
Створити клас потоку Ways, який в методі run містить код знаходження шляхів в графі від заданої початкової до деякої кінцевої та малювання послідовності включення ребер графу у шлях. Граф є спільний для двох потоків. Номери початкових та кінцевих вершин – параметри конструктора. Використати методи малювання ліній. Запустити два потоки з протилежних вершин графу.
5. Контрольні питання
1. Для чого використовуються потоки ?
2. Які є механізми потоків?
3. Основний метод потоку?
4. Властивості потоків ?
Лабораторна робота №4
Тема: створення баз даних за допомогою стандартних бібліотек C#.
Мета: навчитись елементам програмування мовою C#. Засвоїти основні стандартні класи і методи бібліотек sql та swing, та бібліотек, що дозволяють опрацьовувати дані СУБД.
Вступ
Для створення незалежних від платформи клієнт-серверних програм з використанням баз даних використовується інтерфейс C# для баз даних ADO.NET. Рис.1
1.Архітектура ADO .NET
Складовою частиною платформи .NET для забезпечення доступу до СУБД є засоби ADO .NET - зібрання класів, інтерфейсів, структур та типів, що дозволяють реалізувати доступ до даних . ЇЇ можна розглядати як покращена версія ADO.
ADO .NET об’єднує можливості ADO та OLE DB в єдиній системі управління послугами доступу до даних (рис.7.2). Кожна послуга містить класи для реалізації інтерфейсу до різних джерел даних. Наприклад, ADO Managed Provider (до джерел даних OLE DB), SQL Server Managed Provider (доступ до DBMS Microsoft), Exchange Managed Provider (дані з Microsoft Exchange) тощо. ADO .NET підтримує використання документів в у XML форматі. Це спрощує доступ до даних за протоколом HTTP.
Рис.7.2. Доступ до баз даних через ADO.NET
ADO.NET є технологією доступу до баз даних у платформі .NET (Dot Net), яка базується на технології Microsoft ActiveX® Data Objects (ADO). ADO є незалежною від мови програмування технологією об’єктних моделей. ADO.NET є інтегральною частиною засобів .NET Compact Framework і підтримує доступ до реляційних баз даних, до XML документів та даних програм. На її основі можна розробити як клієнтські так і серверні частини проектів широкого спектру задач.
Основні класи та інтерфейси ADO .NET наведені в наступній таблиці:
Об’єкти
Базові класи
Інтерфейси
Призначення
Connection
DbConnection
IDbConnection
Відкриття та закриття з’єднання до джерел даних
Command
DbCommand
IDbCommand
Команди SQL запитів та назви процедур
DataReader
DbDataReader
IDataReader
Доступ до читання (тільки) даних
DataAdapter
DbDataAdapter
IDataAdapter
Посередник між користувачем та місцем зберігання даних. Містить 4 об’єкти команд ( select,
insert, update, delete)
Parameter
DbParameter
IDataParameter,
Параметри для запитів
Transaction
DbTransaction
IDbTransaction
Здійснення транзакцій
.
ADO .NET визначає ряд інтерфейсів, які пропонують базову функційність доступу до джерел даних. Реалізація інтерфейсів на основі методів і властивостей створює конкретні програмні засоби доступу до джерел даних:
Інтерфейс IDbConnection – встановлює сесію з джерелом даних. Дозволяє відкривати та закривати з’єднання, починати та завершати трансакції (методи Commit та Rollback. Класи SqlDbConnection та OleDbConnection реалізують інтерфейс IDbConnection.
Інтерфейс IDbCommand представляє команди, що надсилаються до джерела даних (як правило, в SQL). Класи SqlDbCommand та OleDbCommand реалізують інтерфейс IDbCommand.
Інтерфейс IDataReader описує доступ до джерел даних для читання. Класи SqlDataReader та OleDbDataReader реалізують інтерфейс IDataReader. Метод ExecuteReader повертає групу стовців, а метод ExecuteScalar повертає єдине значення, метод ExecuteNonQuery не повертає нічого (знищення та відновлення).
Інтерфейс IDataAdapter реалізований у класах OleDbDataAdapter та SqlDataAdapter використовується для побудови групи даних. З ними працюють у асинхронному режимі, коли не підтримується відкритим з’єднання з базою даних. Тут можна реалізувати операції вибірки (select), вставки (insert), оновлення (update) та знищення (delete).
В ADO.NET межі транзакцій вказують програмістом. Об’єкти класу Connection мають метод BeginTransaction, який повертає трансакцію (об’єкт типу Transaction). Трансакція виконується при виклиці методу Commit та переривається методомчи Rollback об’єкту Transaction повернутого методом BeginTransaction.
ADO .NET має дві форми доступу до даних:
Доступ без з’єднання: Програма виконує запит і розміщує результати виконання запиту в об’єкті типу DataSet, щоб пізніше їх перенести в задані масиви тощо. В цьому випадку мінімізується час підтримки відкритого з’єднання до бази даних.
Доступ через з’єднання: читання з безадресним курсором ("firehose cursors"). Програма здійснює запит і читає дані з допомогою об’єкту DataReader.
ADO.NET визначає об’єкти типу DataSet та DataTable, які оптимізують перенесення даних по мережах інтранету та Інтернету (в т.ч. крізь firewalls). Технологія надає також традиційні об’єкти Connection і Command.
З допомогою ADO.NET та .NET Framework можна організувати доступ до наступних джерел даних :
SQL Server (System.Data.SqlClient).
OLEDB (System.Data.OleDb).
ODBC (System.Data.Odbc).
Oracle (System.Data.OracleClient).
Двома основними компонентами в ADO.NET є класи: DataSet, та .NET Framework Data Provider (рис.7.3) .
Компонента джерела даних (Data Provider) за призначенням подібна до диспетчерів ODBC чи JDBC та включає наступні об’єкти:
Connection (SqlConnection, OleDbConnection, OdbcConnection, OracleConnection);
Command (SqlCommand, OleDbCommand, OdbcCommand, OracleCommand) - SQL запити для роботи з даними баз даних: select, insert, delete та update;
DataReader (SqlDataReader, OleDbDataReader, OdbcDataReader, OracleDataReader) - для читання даних великих об’ємів, що не розміщуються в пам’яті, DataAdapter використовує його для з’єднання з базою даних;
DataAdapter (SqlDataAdapter, OleDbDataAdapter, OdbcDataAdapter, OracleDataAdapter) - для з’єднання з базою даних контейнера даних .
Об’єкт DataSet - компонента, що містить результати запиту ( містить ряд таблиць). За характером подібний до роз’єднаного кешу даних - місця в пам’яті. Складовими частинами якого є об’єкти DataTables та DataRelations (форма для встановлення зв’язків між таблицями) – зберігають результати виконання команд. DataAdapter - служить зв’язком між контейнером даних DataSet та джерелом (базою) даних Data Provider.
Рис.7.3. Структура засобів ADO.NET
Етапи функціонування ADO.NET є наступні:
Створення об’єкту Connection з вказуванням для нього параметрів з’єднання.
Створення DataAdapter.
Створення об’єкту Command, асоційованого з DataAdapter.
Відкриття DataSet для розміщення даних.
Відкриття з’єднання.
Наповненння DataSet даними з допомогою DataAdapter.
Закриття з’єднання.
Опрацювання даних, що зберігаються в DataSet.
7.3. Операції доступу до даних
В залежності від СУБД, що виступає джерелом даних, до програми залучаються наступні бібліотеки класів (простори назв) :
// СУБД MS Access
using System.Data.OleDb;
//СУБД MS SQL Server
using System.Data.SqlClient;
Для підключення до відповідної бази даних конструктор об’єкту Connection вимагає параметрів, які вказують на комп’ютер джерела даних (сервер, ІР –адреса тощо), шлях до каталога з базою даних, спосіб забезпечення безпеки передачі ( SSPI ), ім’я користувача, зареєстрованого в СУБД, а також відповідний пароль.
Наприклад, необхідно вказати назву бази даних СУБД MS Access для під’єднання до "PersonDatabase.mdb" включно зі шляхом до файлів :
public string
conString=@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@" DataSource=..\\..\\PersonDatabase.mdb";
Конструктором з параметром – рядком адреси створюється об’єкт для відкриття з’єднання з СУБД:
. . . . . .
OleDbConnection con = new OleDbConnection(conString);
// відкрити з’єднання з СУБД
con.Open();
. . . . . .
Відкриття з’єданння займає певні ресурси сервера, які він розділяє між всіма користувачами, що мають доступ до його даних. Тому при написанні вищезазначених операцій слід