Програмування на Delphi під Oracle (исходники), Різне, Програмування, статті

Підключаємося до СУРБД, використовуючи компоненти Delphi


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


Існує багато різних СУРБД. Але так сталося (і цьому сприяло багато передумов), що в абсолютні лідери (за популярністю, поширеності та потужності) вирвалася одна з них. Називати її ім’я я поки не буду, а запропоную краще поглянути на наступну ілюстрацію:

Рейтинг СУРБД на російському ринку


Delphi + Oracle


Уже багато років Oracle є найпоширенішою СУРБД в світі. Тому є багато причин. Які ми в цій статті розглядати не будемо, оскільки вона присвячена іншій темі. З огляду на те, що Oracle широко поширена, необхідно навчитися програмувати для цієї СУРБД не тільки в SQL * Plus (або, припустимо, в SQL Navigator), а й у всіма улюбленої системі програмування (наприклад, Delphi, як у цій статті). Тому для сьогоднішніх експериментів нам знадобиться СУРБД Oracle, яку абсолютно безкоштовно можна скачати з сайту корпорації – розробника (www.oracle.com). Попередньо тільки необхідно зареєструватися та отримати обліковий запис. Безкоштовно для використання в ознайомлювальних цілях, ну, а якщо захочете юзати її для управління (припустимо, своїй) компанією, то доведеться заплатити пристойні гроші за ліцензію. Також, на цьому сайті можна прочитати купу технічної літератури (природно англійською), так, чи інакше пов’язаної з СУРБД Оракл: адміністрування БД, програмування під БД та інше. Що на рахунок версії Оракл, так це не питання. Качаємо будь-яку. Зараз для скачування доступна остання – одинадцята. Я буду використовувати десяту та вам того ж бажаю. Менше розмов, більше діла. Так, до речі, з приводу версії Delphi, яку ми буде сьогодні юзати. Для виконання першої частини статті можна застосовувати хоч стареньку – п’яту Делфі; для виконання другої – сьому і вище. Можна використовувати і шосту, тільки там буде дещо інший набір компонентів, який ми протягом статті розглянемо. Якщо не обумовлено (коли буду розповідати про шостий), то я буду використовувати сьому, просто тому, що вона остання, що зберегла класичний вид.

ADO


Запускаємо Delphi. Акуратно покладемо на формочку той же набір компонентів, який ми кладемо для підключення до БД Access. Ну, якщо ви з тих одиниць, які цього жодного разу не робили (може бути просто, ви не пишете на Делфі), то коротко скажу: з закладки Data Controls палітри компонентів помістіть на форму DBGrid, з закладки DataAccess – компонент DataSource, потім перейдіть на закладку ADO і додайте компоненти ADOConnection і ADOQuery. Для простоти не будемо змінювати їх імена, нехай називаються іменами за умовчанням. Налаштуємо ADOConnection1. Як ви знаєте, він служить для завдання шляху до бази даних і способу відкриття таблиці (завдання драйвера бази даних). В принципі, його можна було не створювати, а скористатися наданим для цього властивістю компонента ADOQuery. Але, звичайно, правильніше скористатися саме компонентом ADOConnection, тому що, швидше за все з однієї бази даних вам треба буде відкрити кілька таблиць, тобто використовувати один шлях до бази даних, заданий один раз в цьому об’єкті. Як програміст (Адміністратор) Oracle ви знаєте, що в одній базі даних може знаходитися тисячі таблиць. Налаштуємо шлях до бази даних. Для цього у властивості ConnectionString компонента ADOConnection1 клацніть на кнопці з трьома крапками. Відкриється знайоме вікно вибору постачальника даних. Виберемо драйвер Oracle Provider for OLE DB.

Вибір драйвера БД


На наступній вкладці («Підключення») введемо дані для підключення до бази даних. «Джерело даних» – це ім’я бази даних. Якщо в процесі установки Оракл, при створенні бази даних ви не змінили значення за умовчанням, то це orcl. Для простоти, в якості користувача задамо привілейованого користувача system. Для експериментів піде, але для реальної роботи в компанії з десятками і сотнями користувачів потрібно серйозно підійти до цього питання і працювати з даними від імені спеціально створеного користувача («можливо, це Ви»). Втім, якщо у адміна бази даних голова не забута будинку, то він сам про це подбає. В якості пароля, введемо той, який ви задали при установці і створенні бази даних Оракл. Перевіримо коннект, клацнувши по відповідній кнопці, якщо все окей, ставимо галочку «Дозволити збереження пароля »і натискаємо OK. Якщо ж ні, то восстанавлівліваем в пам’яті ім’я бази даних і пароль. Потім, в інспектора об’єктів властивості LoginPrompt привласнимо значення False, щоб при підключенні до бази даних ADO не вимагала ім’я та пароль. Можна зараз підключитися до Оракл, встановивши властивість Connected в значення True. Тепер з’єднаємо компоненти.


Знаючі можуть сміливо пропустити цей абзац, не знають, прошу, читайте. Для DBGrid1 як значення властивості DataSource виберіть DataSource1. Для DataSource1 властивості DataSet виберіть ADOQuery1.


Тепер, налаштуємо ADOQuery1. Власне, цей компонент і буде витягувати дані із заданої таблиці. Як видно по імені цього об’єкта, він працює з даними за допомогою запиту. Звичайно, можна було скористатися іншим компонентом, наприклад, ADOTable, який відкриває таблицю повністю і дозволяє працювати з даними за допомогою мови Delphi. Саме тому, ми змушені від нього відмовитися, тому що в таблицях бази даних Оракл може бути занадто багато даних, які нам не потрібні, до того ж всі ці дані (в реалі) доведеться передавати по мережі. Використовуючи запит, ми зможемо попросити у Оракл тільки потрібні нам дані, не вантажі ні його самого (в сенсі Оракл), ні мережу. Насамперед, для властивості Connection встановимо значення – ім’я об’єкта зв’язку ADOConnection1. Після цього відкриємо редактор запиту (активізувавши властивість SQL). Тут, можливий питання: яку таблицю ми хочемо відкрити? Дійсно, яку? У Оракл є величезна кількість різних системних таблиць. Ну, і нехай вони є. Пропоную створити свою. Я, наприклад, вирішив присвятити таблицю книгам, і назвав її books. Ви, звичайно, можете створити будь-яку іншу. OK. Відкриваємо SQL * Plus, пишемо запит – створюємо таблицю. Ось як виглядає вікно програми SQL * Plus в моєму випадку:

Запит для створення таблиці


Заповнювати її ми вже будемо з програми написаної на Delphi. Повертаємося до проекту. Зараз підключимося до створеної таблиці. Для цього в редакторі запиту властивості SQL компонента ADOQuery1 напишемо: select * From books. Ну, власне, поки звідти вибирати нема чого, але хоча б, заголовки, і то вперед. Тепер активізуємо цей запит (властивість Active (в інспектора об’єктів) поставимо в True). Якщо все зроблено правильно, то в об’єкті відображення даних з’являться заголовки створеної таблиці.


Якщо зараз відкомпілювати, запустити додаток і ввести дані (після цього перемістити табличний курсор на яку-небудь іншу запис), то вони збережуться в таблиці бази даних Oracle, як ніби це будь-яка інша локальна таблиця! Залишилося тільки додай кнопку для поновлення даних. В обробнику натиснення на ній напишемо такий код:






ADOQuery1.Active := false;
ADOQuery1.Active := true;

Ось, власне, результат досягнутий: нам вдалося підключитися до бази даних Оракл за допомогою ADO, витягти і модифікувати дані з таблиці. Звичайно, ви можете додати всю функціональність, яку ви додаєте до своїх програм, що працюють з локальними базами даних, наприклад: вставка, видалення запису та інше. Зауважу, багато що можна зробити, відразу на стороні сервера, відправивши запит. Цим ви не тільки спростіть собі життя, написавши одну команду на мові SQL, замість десятка мовою Delphi, але і зробите приємніше життя користувачам своєї програми, скоротивши час очікування результату, виконавши запит відразу на сервері, і тільки відновивши дані у вікні своєї програми.

dbExpress


Тепер, розглянемо інший спосіб підключення до БД Оракл. Зараз, я пропоную не створювати таблицю, ми створимо її з Делфі. У поточний Делфі проект додамо ще один компонент відображення даних, потім, з закладки DataAccess додамо DataSource і з закладки dbExpress додамо SimpleDataSet. Це комплексний компонент, що включає в себе два інших об’єкта. Зауважте, що треба створити саме цей об’єкт – джерело даних, оскільки тільки він коректно працює з Оракл, інші набори даних, що знаходяться на цій сторінці палітри компонентів, працюють не правильно, якщо, взагалі, можна сказати, що працюють: тільки намагаєшся їх підключити, з’являється повідомлення про помилку. Воно пов’язане з тим, що ці набори даних односпрямовані (приблизний переклад повідомлення). Повернемося до SimpleDataSet. В інспектора об’єктів розгорнемо список Connection. Знаходяться в ньому властивості належать подоб’екти зв’язку з БД. Для властивості ConnectionName з знаходиться поруч списку виберемо значення Oracle, потім, налаштуємо список, що відкриває допомогою клацання по кнопці з трьома крапками поруч з властивістю Params. У цьому списку нам треба виставити три значення: ім’я бази даних, до якої ми збираємося підключитися, ім’я користувача та пароль, решта властивості рекомендую не змінювати. В моєму випадку вікно зі списком параметрів виглядає так:

Параметри підключення до БД


Природно, на ілюстрації я приховав свій реальний пароль, оскільки в цьому вікні він відображається у відкритому вигляді (!). Потім, як в минулий раз властивості LoginPrompt (уже в інспектора об’єктів) привласнимо значення False, щоб кожен раз при підключенні не вводити ім’я та пароль. І, нарешті, Connected постав в True. Все, ми в базі. Тепер треба створити таблицю і потім до неї підключиться. Загалом, для роботи з таблицями (Подібно компоненту ADOQuery з закладки ADO) служить подоб’екти DataSet компонента SimpleDataSet. Розгорнемо список його властивостей. Нічого не будемо налаштовувати, оскільки ми напишемо код, тільки перевіримо, щоб властивості CommandType було присвоєно значення ctQuery, адже ми бажаємо використовувати запити для доступу до таблиць з причин зазначеним вище. Додамо на форму ще одну кнопку, обізвемо її: «Створити таблицю». Якщо ви, як я, небайдужі до літератури, тобто прямуєте за мною ще з минулого таблиці, то створіть подія і напишіть в ньому такий код:






SimpleDataSet1.Active := false;
SimpleDataSet1.DataSet.Active := false; try / / можливе виключення, пов’язане з відсутністю повернення курсора
SimpleDataSet1.DataSet.CommandText :=
“create table books2 ( ” +
“Num NUMBER(5) primary key, ” +
“Label VARCHAR2(50), ” +
“Authors VARCHAR(50), ” +
“Publisher VARCHAR2(20), ” +
“Year NUMBER(4), ” +
“Pages NUMBER(5), ” +
“Language VARCHAR2(15))” ;
SimpleDataSet1.DataSet.Active := true;
SimpleDataSet1.Active := true; except / / ігноруємо його
end;
Table_Update(‘select * from books2’);

Цей код, спочатку відключає набір даних, оскільки у мене в програмі він включається на початку роботи програми для отримання даних з раніше створеної таблиці, ви, природно можете це не писати. Потім, у властивість CommandText подоб’екта DataSet об’єкта SimpleDataSet поміщається SQL-запит, який створює таблицю books2 аналогічну таблиці books. Наступним дією, цей запит виконується. Весь цей код укладений в безпечний блок, для того, щоб перехопити виняток. Загалом, з коментарів все ясно. Після блоку обробки виняткової ситуації (тут, блоку ігнорування) програма підключається до тільки, що створеній таблиці. Процедура Table_Update виглядає наступним чином:






procedure TForm1.Table_Update(q : String);
begin
try
SimpleDataSet1.Active := false;
SimpleDataSet1.DataSet.Active := false;
SimpleDataSet1.DataSet.CommandText := q;
SimpleDataSet1.Active := true;
SimpleDataSet1.DataSet.Active := true;
except
end;
end;

Я її написав по тій простій причині, що включений в неї блок коду викликається протягом програми багато раз; змінюється тільки командний рядок – запит. Тому, при виклику я передаю його в якості параметра. Видалення таблиці ви реалізуєте самі, якщо що, дивіться мою програму. Якщо зараз відкомпілювати, запустити програму, потім, створити таблицю, і спробувати ввести дані, то вони не збережуться в таблиці БД Оракл. Видно ADO крутіше, ніж dbExpress. Ну, не дарма ж ми виконали всю цю роботу з підключення до БД за допомогою компонента SimpleDataSet. Звичайно, не дарма. Це я зробив для того, щоб показати, що за допомогою мови SQL в Оракл можна робити хоч що, і писати на ньому від усюди, звідки тільки можливо підключиться до БД. OK. Створимо ще одну кнопочку. Обізвемо її «Скопіювати дані». Двічі клацнемо на ній і напишемо такий код:






with ADOQuery1 do begin
First;
while not ADOQuery1.Eof do begin try / / можливе виключення, пов’язане з відсутністю повернення курсора
SimpleDataSet1.Active := false;
SimpleDataSet1.DataSet.Active := false;
SimpleDataSet1.DataSet.CommandText :=
“insert into books2 values ( ” +
“””” + Fields[0].Text + “””, ” +
“””” + Fields[1].Text + “””, ” +
“””” + Fields[2].Text + “””, ” +
“””” + Fields[3].Text + “””, ” +
“””” + Fields[4].Text + “””, ” +
“””” + Fields[5].Text + “””, ” +
“””” + Fields[6].Text + “””)”;
SimpleDataSet1.Active := true;
SimpleDataSet1.DataSet.Active := true;
except
end;
Next;
end;
end;
Table_Update(“select * from books2”);

Тут, у кожній ітерації циклу виконується могутній SQL-оператор insert, який вставляє в таблицю books2 записи з таблиці books. Цикл закінчується тоді, коли всі записи таблиці books будуть скопійовані. Зробивши це, ми побачили всю силу і міць Delphi + SQL = Oracle! Я описав не всю функціональність програми, так що повну версію програми ви можете подивитися, відкривши исходник, який знаходиться в папці DelphiOracle.

Готова програма


Delphi6


Розглянемо, також, випадок з Delphi6. Якщо вам це не треба, не читайте цей розділ. У кого за раніше стоїть шоста версія (мені вас, дійсно, шкода) створіть новий проект і читайте далі. У цьому проекті я тільки покажу, як в шостій версії Делфі написати додаток для підключення до раніше створеної таблиці books БД Оракл. Проект буде знаходитися в папці D6Oracle. Помістіть на форму об’єкт для огляду даних, DataSource і два компоненти із закладки dbExpress: SQLConnection і SQLClientDataSet. Ось, власне, всі відмінності: за місце одного в сьомій версії, два в шостий. Спочатку, налаштуйте SQLConnection1 подібно подоб’екти зв’язку компонента SimpleDataSet1, потім, підключивши його через відповідне властивість до компоненту SQLClientDataSet1, налаштуйте останній відповідним чином (подібно, подоб’екти DataSet компонента SimpleDataSet1, як ми робили в сьомій версії Делфі). Тільки, не забудьте, в значення властивості CommandText написати такий запит: select * from books, щоб підключитися до цієї таблиці і вилучити з неї дані. Поєднавши всі компоненти, активуйте це господарство, через компонент SQLClientDataSet1. Дані з таблиці постануть перед вашим поглядом! Зауважте, це є dbExpress, і він не може безпосередньо оновлювати дані, тому, щоб здійснити оновлення даних, вам треба буде вбудовувати самописні SQL-запити. Але, як ми бачили – це не проблема.


Кінець


У цій статті описані далеко не всі можливості написання додатків під БД Оракл на Делфі. Але, щоб все описати, потрібен не один грубезний том. Так, я і не ставив перед собою мети зробити це, головне – Дати імпульс до вивчення, а в подальшому ви і без мене знайдете необхідну інформацію. Освоюйте багато різних програмних продуктів (і способів роботи з ними), можете бути впевнені, в житті знадобиться! Удачи!


В архіві в папці DelphiOracle ви знайдете весь вихідний код програми, розглянутої в першій частині статті, а в папці D6Oracle – програму, яка розглянута у другій частині.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*