Программирование на Delphi под Oracle

Программирование на Delphi под Oracle. Статья посвящена обзору и объянению механизмов работы с БД Oracle, имеющихся в системе программирования Delphi. Delphi, Oracle, ADO, dbExpress Юрий "yurembo" Язев

Примеры к статье - DelphiandOracle.rar 546 кб
Автор: Юрий «yurembo» Язев
e-mail: yazevsoft@mail.ru

Подключаемся к СУРБД, используя компоненты 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 – программу, которая рассмотрена во второй части.

www.oracle.com – сайт корпорации Oracle

www.borland.com – сайт корпорации Borland


Опубликовал admin
6 Фев, Среда 2008г.



Программирование для чайников.