Oracle of delphi что это

Обновлено: 03.07.2024

Наталия Елманова, Центр Информационных Технологий

  • иметь меню, похожее на стандартное, с разделами "Файл", "Редактирование", "Сервис", "Справка" (или похожее), при этом пункты меню должны иметь соответствующие "горячие" клавиши клавиши быстрого доступа;
  • иметь инструментальную панель , содержащую кнопки, дублирующие наиболее часто используемые пункты меню;
  • использовать полосы прокрутки , группы радиокнопок, списки, выключатели, строки редактирования и другие интерфейсные элементы, традиционно используемые в современных приложениях;
  • использовать праую клавишу мыши для вызова контекстно-зависимых меню;
  • иметь контекстно-зависимую справочную систему, подсказки для интерфейсных элементов, панель для отражения текущего состояния приложения и комментариев.

Помимо этого, при создании информационной системы следует учитывать возможные пути и возможности ее модернизации, например, потенциальную возможность переноса ее в архитектуру клиент-сервер или замену одного сервера баз данных другим. Такая модернизация должна требовать разумных трудозатрат и происходить безболезненно для пользователя.

Утверждение о том, что приложение должно обладать высокой производительностью, является банальным, однако об этом тоже следует помнить при выборе средства разработки, так как задержки при выполнении тех или иных операций являются одной из главных причин недовольства пользователей.

Современные средства быстрой разработки Windows-приложений, или так называемые RAD-средства (RAD расшифровывается как Rapid Application Development) обладают в той или иной степени почти всеми возможностями создания в приложениях подобных интерфейсных элементов. Многие из них позволяют осуществлять доступ с базам данных, в том числе и к серверным БД. Однако Borland Delphi (как версия 1.0, так и версия 2.0), на взгляд автора, является в этом отношении наиболее наиболее простым и удобным в использовании средством.

  • создание пользовательского интерфейса происходит практически без написания кода;
  • поддерживаются все стандартные интерфейсные элементы - окна просмотра, списки, выключатели, радиокнопки и радиогруппы, полосы прокрутки, меню (как оконные, так и привязанные к конкретным элементам), а также большое количество иных полезных интерфейсных элементов - блокнотов а-ля Word, прогресс-баров и т.д.;
  • легко создаются контекстно-зависимая справка, ярлычки с подсказками, панели состояний, инструментальные панели;
  • имеется большая библиотека шаблонов форм и приложений, которую можно пополнять своими шаблонами;
  • доступ к данным, будь то плоские таблицы или серверные БД типа ORACLE, совершенно однотипен, а описание конкретных источников данных можно вынести за пределы приложения в специальный файл конфигурации бибилиотеки BDE, обеспечивающей универсальную работу с разнородными данными, вплоть до гетерогенных запросов (это могут сделать далеко не все RAD-средства);
  • в процессе разработки можно пользоваться реальными данными, отображаемыми в соответствующих интерфейсных элементах;
  • приложения отличаются высокой производительностью, так как они являются полностью скомпилированными выполняемыми модулями (а большинство используемых RAD-средств использует интерпретируемый код), а, кроме того, язык программирования Object Pascal, используемый в Delphi, отличается жесткой типизацией переменных, что также положительно сказывается на производительности;
  • отладка приложений очень удобна за счет того, что, во-первых , компилятор Pascal является очень быстрым, во-вторых, поддерживается инкрементная компиляция, в-третьих, в среду разработки встроен удобный и гибкий отладчик;
  • средства работы с графикой так же удобны, как и в Pascal (для средств разработки приложений, работающих с БД, это большая редкость);
  • поддерживаются элементы VBX (в первой версии) и OCX (во второй версии); на сегодняшний день на рынке имеется также большое количество дополнительных компонент для Delphi, созданных на самой Delphi, и их создание является несложным процессом;
  • имеется интерфейс со средством контроля версий Intersolv PVCS, облегчающий групповую разработку крупных проектов;
  • имеются удобные средства генерации отчетов, при этом можно использовать и генераторы отчетов сторонних разработчиков (например, Crystal Reports);
  • среда разработки создана с учетом последних достижений в области эргономики - никаких лишних движений мышью, или лишних нажатий на клавиши (рис.1).

Что интересного может предложть Delphi для разработчиков информационных систем на базе ORACLE? Во-первых, высокопроизводительный драйвер этой СУБД (хотя, конечно, никто не запретит Вам пользоваться ODBC, который, естественно, поддерживается Delphi). Во-вторых, Ваши приложения будут добросовестно цитировать все высказвания созданных на сервере триггеров, если таковые будут срабатывать во время работы приложения. В-третьих, если Вы используете версию 2.0 - в Вашем распряжении репозиторий, включающий словарь данных, навигатор баз данных, SQL-монитор, поддержка хранимых процедур и сессий, модули данных, огромное разнообразие интерфейсных элементов, в том числе и похожих на те, что есть в Oracle Power Objects, а также неограниченные возможности наращивания функциональности среды разработки за счет дополнительных эспертов, редакторов свойств и компонент. В-четвертых, Вы можете легко интегрировать в среду разработки продукты третьих фирм, например, для интерфейса с CASE-средствами (один из таких продуктов, CASE Expert - средство для экспорта ER-диаграммы в словарь данных Delphi, входит в поставку Delphi 2.01). Отметим также, что Delphi 2.0 поддерживает многопоточность, OLE-automation и другие механизмы и технологии 32-разрядных операционных систем Windows. В Delphi 2.0 имеются эффктивные механизмы обработки транзакций с использванием механизмов кэшированного обновления данных, поддерживается ряд расширений SQL, имеется Data Pump Expert для переноса данных между серверами и масштабирования приложений. В обеих версиях Delphi Client/Server имеется визуальный конструктор запросов, позволяющий сгенерировать многотабличный запрос на языке SQL, в том числе с вычисляемыми полями (интерфейс и рабочий экран этого конструктора напоминает по внешнему виду некоторые популярные CASE-средства).

Помимо этого, Delphi прекрасно работает с Personal Oracle, что существенно облегчает разработку и отладку приложений, позволяя вынести эти процессы за пределы сети, в которой эксплуатируется действующая версия информационной системы.

На мой взгляд, у Delphi есть один крупный недостаток - созданные приложения не являются многоплатформенными и могут эксплуатироваться только в Windows 95 и NT в случае версии Delphi 2.0, а также дополнительно в Windows 3.1 и 3.11 в случае версии Delphi 1.0 . Но и этот недостаток можно преодолеть путем использования технологии Intranet в корпоративных системах, когда приложение, созданное на Delphi, запускается Web-сервером, а полученные формы отображаются в Web-броузере на компьютере пользователя, где может быть использована любая другая операционная система, отличная от Windows.

Таким образом, Delphi Client/Server 1.0 и Delphi Client/Server Suite 2.0 являются очень удобными инструментами для создания клиентских приложений, использующих серверы ORACLE. Об этом свидетельствует высокая популярность этого средства среди разработчиков программ. Если Вы выбрали это средство - Вы всегда найдете друзей и единомышленников, готовых помочь Вам в случае появления каких-либо проблем, в том числе и в фирме "Интерфейс", имеющей авторизованный учебный центр Borland и консультационную службу.

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

Существует много различных СУРБД. Но так случилось (и этому способствовало много предпосылок), что в абсолютные лидеры (по популярности, распространённости и мощности) вырвалась одна из них. Называть её имя я пока не буду, а предложу лучше взглянуть на следующую иллюстрацию:


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

Delphi + Oracle

Запускаем 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, как будто это любая другая локальная таблица! Осталось только добавь кнопку для обновления данных. В обработчике нажатия на ней напишим такой код:

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

dbExpress


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

Естественно, на иллюстрации я скрыл свой реальный пароль, поскольку в этом окне он отображается в открытом виде (!). Затем, как в прошлый раз свойству LoginPrompt (уже в инспекторе объектов) присвоим значение False, чтобы каждый раз при подключении не вводить имя и пароль. И, наконец, Connected постаим в True. Всё, мы в базе. Теперь надо создать таблицу и потом к ней подключится. В общем, для работы с таблицами (подобно компоненту ADOQuery с закладки ADO) служит подобъект DataSet компонента SimpleDataSet. Развернём список его свойств. Ничего не будем настраивать, поскольку мы напишем код, только проверим, чтобы свойству CommandType было присвоено значение ctQuery, мы ведь желаем использовать запросы для доступа к таблицам по причинам указанным выше. Добавим на форму ещё одну кнопку, обзовём её: «Создать таблицу». Если вы, как я, неравнодушны к литературе, то есть следуете за мной ещё с прошлой таблицы, то создайте событие и напишите в нём такой код:

Этот код, сначала отключает набор данных, поскольку у меня в программе он включается в начале работы программы для извлечения данных из ранее созданной таблицы, вы, естественно можете это не писать. Затем, в свойство CommandText подобъекта DataSet объекта SimpleDataSet помещается SQL-запрос, который создаёт таблицу books2 аналогичную таблице books. Следующим действием, этот запрос выполняется. Весь этот код заключён в безопасный блок, для того, чтобы перехватить исключение. В общем, по комментариям всё ясно. После блока обработки исключительной ситуации (здесь, блока игнорирования) программа подключается к только, что созданной таблице. Процедура Table_Update выглядит следующим образом:

Я её написал по той простой причине, что включённый в неё блок кода вызывается на протяжении программы много раз; изменяется только командная строка - запрос. Поэтому, при вызове я передаю его в качестве параметра. Удаление таблицы вы реализуете сами, если что, смотрите мою программу. Если сейчас откомпилировать, запустить программу, затем, создать таблицу, и попробовать ввести данные, то они не сохранятся в таблице БД Оракл. Видно ADO круче, чем dbExpress. Ну, не зря же мы проделали всю эту работу по подключению к БД с помощью компонента SimpleDataSet. Конечно, не зря. Это я сделал для того, чтобы показать, что с помощью языка SQL в Оракл можно делать хоть что, и писать на нём ото всюду, откуда только возможно подключится к БД. OK. Создадим ещё одну кнопочку. Обзовём её «Скопировать данные». Дважды щёлкнем на ней и напишем такой код:

Здесь, в каждой итерации цикла выполняется могучий 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 - программу, которая рассмотрена во второй части.

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

Примеры к статье - DelphiandOracle.rar 546 кб

Подключаемся к СУРБД, используя компоненты Delphi.

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

Существует много различных СУРБД. Но так случилось (и этому способствовало много предпосылок), что в абсолютные лидеры (по популярности, распространённости и мощности) вырвалась одна из них. Называть её имя я пока не буду, а предложу лучше взглянуть на следующую иллюстрацию:

Рейтинг СУРБД на российском рынке.

Delphi + Oracle.

Уже много лет Oracle является самой распространённой СУРБД в мире. Тому есть много причин. Которые мы в этой статье рассматривать не будем, поскольку она посвящена другой теме. Ввиду того, что Oracle широко распространена, необходимо научиться программировать для этой СУРБД не только в SQL*Plus (или, предположим, в SQL Navigator), но и во всеми любимой системе программирования (например, Delphi, как в этой статье). Поэтому для сегодняшних экспериментов нам понадобится СУРБД Oracle, которую абсолютно бесплатно можно скачать с сайта корпорации - разработчика . Предварительно только необходимо зарегистрироваться и получить аккаунт. Бесплатно для использования в ознакомительных целях, ну, а если захотите юзать её для управления (предположим, своей) компанией, то придётся заплатить приличные деньги за лицензию. Также, на этом сайте можно прочитать кучу технической литературы (естественно на английском), так, или иначе связанной с СУРБД Оракл: администрирование БД, программирование под БД и другое. Что на счёт версии Оракла, так это не вопрос. Качаем любую. Сейчас для скачивания доступна последняя – одиннадцатая. Я буду использовать десятую и вам того же желаю. Меньше разговоров, больше дела. Да, кстати, по поводу версии Delphi, которую мы будет сегодня юзать. Для выполнения первой части статьи можно применять хоть старушку – пятую Делфи; для выполнения второй – седьмую и выше. Можно использовать и шестую, только там будет несколько другой набор компонентов, который мы в течении статьи рассмотрим. Если не оговорено (когда буду рассказывать о шестой), то я буду использовать седьмую, просто потому, что она последняя, сохранившая классический вид.

Запускаем 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, как будто это любая другая локальная таблица! Осталось только добавь кнопку для обновления данных. В обработчике нажатия на ней напишим такой код:

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

dbExpress.

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

Естественно, на иллюстрации я скрыл свой реальный пароль, поскольку в этом окне он отображается в открытом виде (!). Затем, как в прошлый раз свойству LoginPrompt (уже в инспекторе объектов) присвоим значение False, чтобы каждый раз при подключении не вводить имя и пароль. И, наконец, Connected постаим в True. Всё, мы в базе. Теперь надо создать таблицу и потом к ней подключится. В общем, для работы с таблицами (подобно компоненту ADOQuery с закладки ADO) служит подобъект DataSet компонента SimpleDataSet. Развернём список его свойств. Ничего не будем настраивать, поскольку мы напишем код, только проверим, чтобы свойству CommandType было присвоено значение ctQuery, мы ведь желаем использовать запросы для доступа к таблицам по причинам указанным выше. Добавим на форму ещё одну кнопку, обзовём её: «Создать таблицу». Если вы, как я, неравнодушны к литературе, то есть следуете за мной ещё с прошлой таблицы, то создайте событие и напишите в нём такой код:

Этот код, сначала отключает набор данных, поскольку у меня в программе он включается в начале работы программы для извлечения данных из ранее созданной таблицы, вы, естественно можете это не писать. Затем, в свойство CommandText подобъекта DataSet объекта SimpleDataSet помещается SQL-запрос, который создаёт таблицу books2 аналогичную таблице books. Следующим действием, этот запрос выполняется. Весь этот код заключён в безопасный блок, для того, чтобы перехватить исключение. В общем, по комментариям всё ясно. После блока обработки исключительной ситуации (здесь, блока игнорирования) программа подключается к только, что созданной таблице. Процедура Table_Update выглядит следующим образом:

Я её написал по той простой причине, что включённый в неё блок кода вызывается на протяжении программы много раз; изменяется только командная строка – запрос. Поэтому, при вызове я передаю его в качестве параметра. Удаление таблицы вы реализуете сами, если что, смотрите мою программу. Если сейчас откомпилировать, запустить программу, затем, создать таблицу, и попробовать ввести данные, то они не сохранятся в таблице БД Оракл. Видно ADO круче, чем dbExpress. Ну, не зря же мы проделали всю эту работу по подключению к БД с помощью компонента SimpleDataSet. Конечно, не зря. Это я сделал для того, чтобы показать, что с помощью языка SQL в Оракл можно делать хоть что, и писать на нём ото всюду, откуда только возможно подключится к БД. OK. Создадим ещё одну кнопочку. Обзовём её «Скопировать данные». Дважды щёлкнем на ней и напишем такой код:

Здесь, в каждой итерации цикла выполняется могучий 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 – программу, которая рассмотрена во второй части.

Сегодня будут рассмотрены остальные основные компоненты ODAC.

А для начала - интересная новость от IBM:

IBM выпустила бесплатную версию DB2
IBM начала предлагать бесплатную версию СУБД DB2 - DB2 Universal Database Express-C, которую можно использовать не более чем на двух двухпроцессорных серверах, имеющих до 4 Гбайт памяти. Продукт доступен в вариантах для Linux и Windows. Отличием от аналогичных предложений основных конкурентов IBM является отсутствие ограничений на количество одновременно подключенных к СУБД пользователей и на размер баз. Однако в DB2 Express-C отсутствуют некоторые из функций платной DB2 Express, включая модуль DB2 Warehouse Manager, механизм тиражирования источников данных формата Informix и адаптеры обмена данными DB2 Connect. Лицензия разрешает использовать Express-C для нужд предприятия и использовать в составе коммерческих программных продуктов. Продукт можно загрузить по этому адресу. До IBM бесплатные варианты своих СУБД также выпустили Oracle и Microsoft.

Если после выходных Вам лень работать, то ждем Вас на форуме, где можно малость отвлечься от работы и поболтать на отвлеченные темы:

К сожалению, в учебных заведениях, в лучшем случае преподают только технологию программирования, худшие варианты рассматривать не будем.
А меня интересует другой вопрос - вопрос культуры программирования.
Обсудить

Голосование и обсуждение.
К сожалению, наблюдается тенденция, что для повышения зп и своего статуса приходится менять работу.
А для многих это стало способом быстрого увеличения зп и они буквально скачут с места на место.
Как часто меняете работу Вы ? С чем это связано и как по Вашему должно быть?

Обсудить

Собственно хочу узнать какую пользу природа хотела получить и что она получила в итоге, создав человечество на этом земном шаре? Высказывайте свои предположения!
Обсудить

В начале сегодняшнего выпуска хотелось бы остановится на объектах-полях. Объекты-поля не являются "собственностью" ODAC, а уже заложены в механизм доступа к БД TDataSet.

При выполнении запроса датасет автоматически создает в памяти поля-объекты и именно к ним происходит обращение при помоши FieldByName/Fields. Однако такие поля-объекты можно создавать самим, что дает определенные преимущества, например, можно настраивать формат отображения, заголовок поля, а также обращаться к значению поля как к обычному компоненту. Также можно создавать лукап-поля и калк-поля. Рассмотрим все перечисленные возможности.

Создать объекты-поля очень легко - для этого нужно вызвать редактор Fields Editor (одноименный пункт в контекстном меню датасета или редактор свойства Fields). В появившемся пустом списке
из контекстного меню нужно выбрать один из трех вариантов:

  • Add fields. - добавить одно или несколько плей (из предложенных в списке)
  • New field. - создать новое поле (тут можно создать калк- или лукап-поле)
  • Add all fields. - добавить все поля.

Чтобы не лить много воды (хоть я и Водолей :) ) рассмотрим создание полей на конкретном примере. Создаем новый проект, настраиваем подключение к Ораклу (TOraSession, см 7 выпуск), в TOraQuery пишем следующий запрос select owner, object_name, object_type, status from all_objects. Теперь открываем редактор полей и вызываем команду Add all fields. У вас должно получится так:

Свойства подробно расписаны в справочной системе и я останавливаться на них не буду, замечу, что назначение свойств понятно из названия. Обратите просто внимание на такие свойства, как DisplayFormat, DisplayLabel, ReadOnly, Required. Остановлюсь только на событии OnGetText. Это событие позволяет произвольно изменять визуальное содержимое поля. Например, если в поле Вы храните пол человека в виде M/F, то в этом событии можно сделать виртуальную подстановку на Муж/Жен:

Если такие поля будут редактируемыми, то нужно также написать обработчик OnSetText, где выполнить обратные преобразования.

Теперь для доступа к полям можно написать OraQuery1STATUS.Value, хотя OraQuery1.FieldByName('status').asString никто не отменял :)

Очень часто Вы будите создавать калк- и лукап-поля. Для примера создадим калк-поле. Для этого выберем команду New field. В появившемся окне вводим имя поля, тип, и выбираем вид поля - Calculated:

Так как поле вычисляемое на стороне клиента, то Вы сами должны позаботится о его значении. Для этого у TDataSet есть событие onCalcFields:

Здесь мы новому полю присваиваем кол-во считанных записей с сервера. Запустите пример попередвигайтесь по гриду вперед/назад и посмотрите, какие значения будут у этого поля. Если Вы внимательно читали предыдущие выпуски, то Вы без труда поймете поведение этого поля.

Рассмотрим создание лукап-поля. Лукап-поля используются для подстановки значения указанного поля из другой таблицы вместо поля текущего запроса (организация связи основной запрос - справочники). Давайте в нашем примере добавим новое поле, которое будет показывать код владельца объекта базы. (Хотя это лучше сделать одним запросом). Для этого добавим еще один компонент TOraQuery и припишем там запрос select * from all_users. У OraQuery1 создаем новое поле:

Результат виден моментально.

Теперь вернемся к рассмотрению компонентов ODAC.

OraQuery может также выполнять хранимые процедуры/функции, а также анонимные блоки PL/SQL. Вот рабочий пример вызова хранимой функции:

Хотя здесь и используется компонент OraSession вместо OraQuery, но в этом нет ничего страшного, можно смело использовать OraQuery.

Компонент TSmartQuery

В прошлом выпуске мы научились создавать "живые" запросы (это такие запросы, которые поддерживают модификацию данных). Для этого нужно было заполнить соответствующими командами свойства SQLInsert/SQLUpdate/SQLDelete. Это все хорошо, если бы не было столь утомительным :) (даже с учетом того, что редактор помогает сгенерировать эти команды). SmartQuery расширяет возможности OraQuery и самостоятельно во время генерирует нужные команды модификации. Достаточно только заполнить свойства SQL, KeySequence, KeyFields - все остальное сделает компонент. В конце выпуска будет приведен рабочий пример.

SmartQuery поддерживает очень интересную возможность SmartRefresh (см. одноименное свойство). Суть этой техники состоит в следующем. Как вы наверное заметили при многопользовательской работе, если один клиент внес какие-либо изменения в таблицу, то все другие клиенты для отображения изменений должны переоткрыть нужные запросы. Это справедливо для всех СУБД и всех библиотек доступа к СУБД. Но ODAC и тут на высоте. Благодаря встроенному пакету Оракла dbms_pipe ODAC может давать сигналы другим клиентам, что были внесены изменения в данные и их нужно перечитать. Чтобы посмотреть SmartRefresh в действии, создайте новый проект, "натравите" TSmartQuery на какую-либо табличку (примерный запрос select t.*, t.rowid from mytable), включите SmartRefresh и подключите SmartQuery к гриду. Запустите программу несколько раз (или на разных компах) и внесите изменения на одном клиенте. Посмотрите, как ведут себя другие клиенты.

Компонент TOraSQL

Этот компонент аналогичен TOraQuery за небольшим исключением. Он предназначен для выполнения любой команды/процедуры/анонимного блока PL/SQL, кроме команды select. В результате этого этот компонент меньше весит и меньше расходует память.

Компонент TOraTable

Предназначен для работы с одной таблицей без написания какого-то бы ни было sql-кода, просто указываете имя таблицы. Является наследником TSmartQuery.

Компонент TOraStoredProc

Предназначен для выполнения хранимых процедур/функций без написания какого-то бы ни было sql-кода, просто укажите имя процедуры/функции. Приведенный выше sql-код в функции IsUniqueRNN я получил именно с помощью этого компонента.

Компонент TOraScript

Этот компонент предназначен для выполнения последовательности команд. Вы можете сказать, что последовательность команд можно оформить в виде PL/SQL кода и выполнить через другие компоненты, но в PL/SQL коде нельзя указывать команды DDL. Вот тут и приходит на помощь TOraScript. Каждая команда должна быть отделена от других символом ; или /, причем / должен начинаться с новой строки и любой блок PL/SQL должен заканчиваться символом /.

Компонент TOraPackage

Предназначен для инкапсуляции работы с пакетами. Хочу заметить, что с пакетами можно работать с помощью анонимного блока PL/SQL, а следовательно с помощью компонент TOraQuery, TOraSmartQuery, TOraSQL.

Компонент TOraLoader

Предназначен для быстрой загрузки данных в таблицу, используя встроенные в Оракл возможности по заливке данных. На использование этого компонента накладываются следующие ограничения:

  • триггеры не поддерживаются
  • проверочные ограничения не поддерживаются
  • ограничения справочной целостности не поддерживаются
  • кластерные таблицы не поддерживаются
  • пользовательские типы данных не поддерживаются

Для использования загрузчика Оракла нужно выполнить следующие шаги:

  1. указать имя таблицы в свойстве TableName
  2. настроить поля, в которые будут загружаться данные (свойство Columns)
  3. написать обработчик события OnGetColumnData или OnPutData
  4. вызвать метод Load для начала загрузки данных

Компонент TOraErrorHandler

Обработчик OnError может быть примерно таким:

Тут все должно быть понятно, кроме разве конструкции

Вот и закончился краткий обзор библиотеки ODAC. В заключении хочу привести небольшой примерчик использования ODAC. В примере будет реализован ввод плановых показателей по месяцам в разрезе городов.

Для начала была создана следующуя стуктура таблиц:

Несколько замечаний по структуре:
1. На таблицу periods_tab не выданы гранты на изменение, так как нет абсолютно никакого смысла изменять период.
2. На таблицу PLAN_CITY_TAB не были выданы гранты на вставку и удаление, так как вставка и удаление происходит автоматически - добавление городов в триггере trg_periods_ai, а удаление - ограничением справочной целостности FK_PLAN_CITY_PERIOD.
3. В триггерах trg_plan_city_bi и trg_periods_bi сначала проверяется, установлено ли значение первичного ключа и если нет, то генерируется.
4. Значение месяца должно быть в интервале 1..12 (проверка CHK_PERIODS_MONTH)
Таким образом, вся бизнес-логика была реализована на стороне сервера. Клиент будет реализовывать только интерфейс пользователя (ввод и редактирование первичных данных).

В качестве интерфейса были взяты два DBGridEh (библиотека EhLib). В первом гриде будут отображаться плановые периоды, а во втором - планы по городам за выбранный период (классическая связь master/detail)
Настройки первого грида:

Обратите внимание на второй столбец - в таблицу будет записываться значение из KeyList, а в гриде отображаться соответствующее значение из PickList.

Настройки второго грида:

Обратите внимание, что грид будет поддерживать только операции редактирования (наши юзеры каким-то образом умудрились добавить вручную города в таблицу plan_city_tab, хотя на уровне самой таблицы у них не было прав, как им это удалось - уму непостижимо :)). Название колонок грид берет у соответствующего датасета (а точнее у его полей-объектов), в то время как у первого грида заголовки колонок были заданы явно.

Настала очередь датасетов. С первым гридом ассоциирован датасет:

Тут должно быть все понятно (если внимательно читали прошлые выпуски). Единственно хочу сказать, что сразу перевожу датасет в режим ReadOnly, чтобы пользователи бесконтрольно не стали вводить периоды.

Второй датасет (ассоциирован со втором гридом):

В этом датасете было создано лукап-поле для отображения названия города по его коду.

Осталась самая малость - при открытии формы открыть датасеты:
qPeriods.Open;
qPlanCity.Open;
и сделать три кнопочки:
* добавить период
* удалить период
* сохранить изменения
вот их обработчики:

Ну и еще несколько обработчиков для управления кнопками

Вот и подошел к концу краткий обзор компонент ODAC. Надеюсь, что данный цикл был для Вас полезен и Вы узнали что-то новое. С библиотекой ODAC идет хорошая справка и множество примеров, которые показывают все возможности и особенности ODAC, рекомендую их просмотреть.

Читайте также: