Подключение oracle к delphi
Лет 20-25 тому назад каждая программа для работы с базами данных написанная на Delphi таскала за собой десятки мегабайт Borland Database Engine (BDE). Программисты и администраторы, кроме установки и настройки клиентского программного обеспечения СУБД, были вынуждены создавать и настраивать алиасы BDE. Их жизнь упростилась, когда стали появляться библиотеки, работающие с базами данных через API их клиентского программного обеспечения. Сегодня я хочу рассказать о различных вариантах подключения к серверу базы данных Oracle на примере одной из подобных библиотек - Universal Data Access Components (Devart UniDAC).
Для начала рассмотрим используемый в UniDAC режим подключения по умолчанию - "client mode". В этом режиме для подключения к серверу базы данных Oracle используется библиотека Oracle Call Interface (OCI). Для работы через OCI необходимо, чтобы на компьютере было установлено клиентское программное обеспечение Oracle. Для наглядности, создадим тестовую базу данных у которой SID и Service Name не совпадают.
Вариант 1. На компьютере установлен клиент Oracle и настроен TNSNAMES.ORA: Вариант 2. На компьютере установлен клиент Oracle без настроеного TNSNAMES.ORA. Используем Oracle Service Name (SN): При этом порт можно не указывать: Вариант 3. На компьютере установлен клиент Oracle без настроеного TNSNAMES.ORA. Используем Oracle System Identifier (SID): Как и во 2-м варианте порт можно не указывать: Работа с базой данных в "client mode" требует дополнительных затрат на установку и настройку клиентского программного обеспечения Oracle. Поэтому разработчики предоставили возможность подключения к БД Oracle в "direct mode". При его использовании программа подключается к БД по протоколу TCP/IP напрямую, без установки клиентского программного обеспечения. С точки зрения безопасности использование "direct mode" аналогичен использованию клиента Oracle без Oracle Advanced Security. Чтобы подключиться из UniDAC к БД Oracle в "direct mode" необходимо в SpecificOptions экземпляра объекта TUniConnection установить значение свойства "Direct" в "True": Вариант 4. На компьютере не установлен клиент Oracle. Используем Oracle Service Name (SN): Строку параметров сервера можно указать как во втором варианте, без "sn brush: delphi; gutter: false">db.Server := '192.168.1.5:1521/testSN'
и даже без порта: Вариант 5. На компьютере не установлен клиент Oracle. Используем Oracle System Identifier (SID): Как и в 4-м варианте "sid brush: delphi; gutter: false">db.Server := '192.168.1.5/testSID'
Следует отметить, что производительность программы и размер ее файла не зависит от выбранного режима подключения. Но "direct mode" накладывает некоторые несущественные ограничения. Например, могут возникнуть некоторые проблемы при использовании межсетевых экранов. Подробнее о подключении к серверу базы данных Oracle вы можете почитать в документации библиотеки в разделе "Using Oracle data access provider with UniDAC in Delphi".
Этот пост является продолжением серии постов “Oracle дома. Быстрый старт” (часть 1, часть 2, часть 3).
Прежде чем начать что-то делать в Delphi, рассмотрим некоторые инструменты, которые мы могли бы использовать для работы с Oracle. Грубо их можно разделить на две категории:
- Встроенные компоненты Delphi.
- Сторонние компоненты.
Встроенные компоненты Delphi
Я вкратце напишу только о тех, с которыми мне довелось пользоваться на практике. А это:
BDE – это уже устаревший механизм, с ним конечно связано много воспоминаний (как положительных, так и отрицательных), но его настоятельно не рекомендуется использовать в новых проектах и в Delphi он оставлен лишь для совместимости. К главным его недостаткам можно отнести необходимость “тащить” дистрибутив BDE при распространении своего приложения.
dbGo, ранее называлось ADO – это набор компонентов, которые используют ActiveX технологию ADO. Сам по себе этот инструмент удобный и достаточно универсальный, если предполагается работать с разными СУБД. Более того, библиотеки ADO входят в последние версии Windows и не требуют дополнительной установки. Однако для работы с конкретной СУБД используется дополнительный ODBC-драйвер, который может потребовать дополнительной конфигурации. Да и вообще работа с базой данных тормозиться, тут цепочка вызовов примерно такая: – – – – – .
dbExpress – это механизм, который пришёл на смену BDE в Delphi 6. Вот несколько ссылок о причинах его появления и трудностях его использования: Технология dbExpress, Quick Guide: dbExpress, Перенос приложений с BDE на dbExpress. В отличии от ADO, тут цепочка короче: – – – – , причём компоненты dbExpress являются простой (не COM) обёрткой над драйвером-библиотекой. Однако и тут цепочка получается длинной, более короткую можно получить только с использованием сторонних компонентов.
Сторонние компоненты
Их существует великое множество. Но мы определились, что будем работать с Oracle, а это значительно сужает круг. Скажу сразу, что я пользовался не всеми, но на слуху следующие компоненты:
Использование сторонних компонентов позволяет сократить цепочку вызовов до такой: – – – , что является самым оптимальным.
DOA (Direct Oracle Access) – это набор компонентов, предлагаемых компанией Allround Automations (AA), которая знаменита продуктом PL/SQL Developer. (Кстати сказать, PL/SQL Developer – это наверное один из лучших продуктов для кодирования и отладки pl/sql кода в Oracle, но он платный.) PL/SQL Developer использует именно DOA. Честно говоря – я не пользовался этими компонентами, но мне довелось однажды писать плагин для PL/SQL Developer – там всё более чем прозрачно и понятно. Немного погуглив, могу голословно заявить следующее: DOA является стабильным и простым для усвоения (даже для новичков) набором компонентов. Однако скорость его развития сильно зависит от нужд PL/SQL Developer’а. Ну т.е. с появлением новых версий Delphi разработчики AA не сильно то и торопятся обновлять свои компоненты. Скорее даже так: частота обновлений DOA зависит от появлений новых версий Oracle. Стоимость DOA колеблется от $129 до $578. Если бы я покупал DOA, то выбрал бы комплектацию за $478.
ODAC (Oracle Data Access Components) – продукт компании Devart – монстра всевозможных решений для разных СУБД, языков программирования и платформ. (Мне однажды потребовалось написать программу (2007 год), которая бы с КПК (Pocket PC) подключалась бы напрямую к БД – у Devart мы нашли необходимые библиотеки и компоненты.) Отличительной особенностью ODAC является возможность подключения к Oracle напрямую, в обход oci.dll (так называемый Direct Mode), т.е. цепочка подключения будет самой короткой: – – , а значит и самой быстрой. Правда там есть некоторые ограничения и Devart не рекомендует им пользоваться в общем случае, т.е. рекомендует пользоваться режимом с использованием oci.dll. И ещё одно “кстати”: ODAC вроде как уже поддерживает FMX, когда как конкуренты – пока ещё нет. Стоимость ODAC для одного пользователя колеблется от $149.95 до $499.95. Для себя я бы выбрал версию за $449.95.
AnyDAC (Universal Data Access Components) – разработка компании DA-SOFT Technologies. Вообще, ещё до появления AnyDAC, были компоненты NcOCI7, а затем FreeDAC – бесплатные разработки Дмитрия Арефьева, с которыми я в основном и работал. И именно обёртка над oci.dll из состава компонент FreeDAC сейчас используется у нас в компании (а далее у нас используются самописные компоненты, которые по скорости работы с Oracle не уступают другим компонентам). К плюсам этой библиотеки можно отнести отзывчивость и быструю реакцию со стороны службы поддержки. А при желании можно договориться и о скидках :с). Стоимость AnyDAC для одного пользователя составляет $399.
Что выбрать?
Если Вы собираетесь писать серьёзный проект, то по-любому лучше выбрать сторонние компоненты. Какой именно компонент выбрать – однозначного ответа Вам никто не даст: каждый будет говорить о “своих” плюсах. Я же давно собираюсь написать объективное тест-приложение для сравнения этих компонентов между собой, но всё никак не доходят руки это сделать. И в интернете напрямую их особо никто и не сравнивает (по крайней мере исходников тестов я не нашёл).
А для начала мы выберем dbExpress – родной для Delphi механизм, по которому достаточно примеров можно найти в глобальной сети.
Запускаем Delphi, создаём новое VCL приложение. “Кидаем” на форму компоненты и настраиваем их:
dbExpress \ TSQLConnection –> SQLConnection1
dbExpress \ TSimpleDataSet –> SimpleDataSet1
Data Access \ TDataSource –> DataSource1
Data Controls \ TDBGrid –> DBGrid1
Всё :с) Уже в Design-Time мы увидим результат выборки из таблицы emp. Можно запустить приложение и увидеть это в run-time. Приложение получилось настолько простым, что я не стал делать ни скрин-шотов, ни выкладывать какие-либо исходники. А дальше – добро пожаловать в мир разработки приложений для работы с базами данных :с).
Пошаговое описание того, как в домашних условиях с наименьшими трудозатратами установить и запустить СУБД Oracle (для начала в академических целях). И чем-нибудь к нему подключиться и выполнить простой запрос. Замечу, что можно пойти разными путями, я выбрал, как мне кажется, максимально гибкий и минимально трудоёмкий.
Лирическое отступление
Моя программистская деятельность тесно связана с разработкой программ, работающих с базами данных. По мере моего взросления, мне удалось/пришлось поработать с разными СУБД. Были проекты и на Delphi 5 + BDE + Paradox, были и MS Access + VBA, были и Delphi 2006 + ADO + MS SQL Server. Но так получилось, что в компании, в которую я пришёл в 2006 году, использовалась СУБД Oracle. И надо признать, эта СУБД меня сильно впечатлила. И, хотя, моё основное направление – это разработка интерфейсов для работы с БД (т.е. Delphi), у меня достаточно задач и по проектированию структуры БД и реализации бизнес-логики на PL/SQL. И самое главное, я по сей день открываю всё новые и новые возможности этой СУБД :с)
Я не буду больше нахваливать эту СУБД, приведу лишь пару интересных ссылок: Oracle vs MSSQL2k и Oracle 10g vs SQL Server 2005.
Это бесплатно?
Oracle предоставляет несколько версий своей СУБД, есть и бесплатные её редакции. А самое главное, у Oracle есть бесплатный набор для ознакомительных целей разработчиков, им и воспользуемся.
Что для этого нужно?
Во-первых, надо зарегистрироваться на официальном сайте Oracle. Ссылка для регистрации находится в самом верху, надо не побояться вбить свои контактные данные. (Или побояться, и вбить чужие:))
Во-вторых, нам понадобится виртуальная машина. С этой страницы, Вы можете скачать дистрибутив VirtualBox последней версии для своей платформы (Windows/Mac/Solaris/Linux). Установка виртуальной машины тривиальна (можно выбрать русский язык). А вот её сетевые настройки – не совсем, но об этом позже.
В-третьих, чтобы не заниматься скачиванием/разворачиванием/настройкой СУБД, просто скачиваем уже подготовленный для VirtualBox образ виртуальной машины, на которой это уже всё сделано за нас. Надо заметить, Oracle предоставляет разработчикам несколько инструментов уже собранных и установленных на виртуальную машину. Последние версии образов виртуальных машин можно скачать отсюда. Нам же понадобится Database App Development VM - по этой ссылке вы попадёте на страницу с описанием, как всё установить (ссылка действительна на момент написания заметки, если она не работает, то просто найдите пункт “Database App Development VM” по предыдущей ссылке). А вот и сам образ (внимание: 4.2 Гб!). После скачивания, образ импортируется в VirtualBox (Файл \ Импорт конфигурации). Ну и после импорта проверяем, правильно ли импортировалось. Запускаем двойным кликом по Oracle Developer Days. Как только прогрузится операционная система и Вы увидите экран c надписью “Enterprise Linux 5”, воводите oracle/oracle – позволяем системе донастроится (ждём, пока не появится окно терминала). Теперь мы готовы продолжать, а если не готовы, то гостевую машину можно выключить – либо через саму операционную систему (System \ Shut Down – это выключит гостевую машину), либо через меню VirtualBox (тут есть варианты, через меню лучше ставить машину на паузу, но не выключать).
Итак, теперь у нас есть:
- VirtualBox – менеджер виртуальных машин;
- виртуальная машина Oracle Developer Days с предустановленной ОС (Linux) и предустановленной СУБД Oracle (Enterprise Edition). А ещё тут предустановлен ряд инструментов, нам понадобится Oracle SQL Developer.
Пробуем выполнить запрос?
Конечно! Запускаем Oracle Developer Days (если успели выключить), логинимся (username: oracle, password: oracle). В окне терминала запускаем СУБД командой
эту строку можно скопировать из самого же терминала, чуть выше. Ждём немного, и в окне терминала видим, что СУБД стартанула.
Запускаем Applications \ Oracle Dev Days \ Oracle SQL Developer. Заводим запись для подключения к нашей базе: File \ New… –> Database Connection (либо на вкладке Connections нажимаем плюсик). Заполняем окно:
Здесь: Connection Name – произвольное имя для инструмента Oracle SQL Developer, Username – имя пользователя БД (scott – стандартное имя для предустановленной СУБД), Password – пароль пользователя (вводим oracle; все пароли на данной машине одинаковы). Connection Type – способ подключения к БД, выберем самый простой в данном случае – подключение с использованием TNS. Network Alias – это сетевое имя БД, известное службе TNS (у этой службы есть свой конфигурационный файл, в котором прописаны алиасы; за алиасом скрываются детали подключения к БД, такие как хост, порт, сид (имя экземпляра БД, он же инстанс) и другие), выбираем ORCL. Для проверки жамкаем Test, и над кнопкой Help увидим Status : Success (или увидим причину, по которой не удалось подключиться). Жамкаем Save и закрываем окно. Теперь подключаемся – двойной клик на только что созданную запись, в правой (основной) части окна вводим простейший запрос:
и нажимаем Ctrl+Enter. Должно получиться примерно так:
Вкладка Query Result показывает результат выборки.
Спасибо за внимание
На этом пока всё, жду комментариев. В принципе, я планирую развить тему как минимум двумя пунктами:
- Подключение к данной Oracle из хост-ситемы и из другой виртуальной машины.
- Пишем простое приложение на Delphi.
Если Вас это заинтересовало, пишите, это будет мне стимулом для продолжения :с)
В этой заметке я расскажу как установить и настроить oracle-клиент в ОС Windows. Плюс немного расскажу об инструменте, который можно использовать для работы с СУБД.
Прошу обратить внимание – Windows
Т.к. в конечном итоге у нас задача написать Windows приложение в Delphi, то далее описываемые мной действия относятся в основном к Windows 7. Если у Вас Windows XP, то отличия будут минимальны.
Описываемые далее действия Вы можете выполнить либо для хост-системы, либо для другой виртуальной машины с установленной ОС Windows. Версия и разрядность ОС принципиального значения не имеют.
Настройка файла hosts (не обязательно)
Для удобства можно дописать в файл hosts такую строку:
Это позволит использовать указанное имя oracle вместо указанного IP адреса при подключении к серверу. Например, вместо ping 192.168.56.101 можно будет писать ping oracle, результат будет одинаковым.
HINT: Для редактирования файла hosts понадобятся права администратора. Можно сделать так: Пуск \ Все программы \ Стандартные, правой кнопкой мыши на Блокнот, выбрать пункт Запуск от имени администратора:
И в блокноте уже меню Файл \ Открыть… –> C:\Windows\System32\drivers\etc\hosts
Уcтановка Oracle Instant Client
Для работы с СУБД Oracle на локальном компьютере должен быть установлен так называемый oracle-клиент. Oracle-клиент – это библиотека OCI.DLL плюс ещё несколько библиотек, необходимых для работы программ с СУБД. (Отмечу правда, что возможны случаи обхода этого правила, однако я настоятельно не рекомендую их использовать.)
HINT: Oracle-клиент – это отдельный продукт, развиваемый разработчиками Oracle параллельно развитию СУБД. Oracle-клиент, как и СУБД, имеет свою версию. Как правило с выходом новой версии СУБД Oracle, в свет появляется соответствующая версия oracle-клиента. Так например, на нашей Oracle Developer Days установлена СУБД Oracle 11g, так же доступна версия 11 для oracle-клиента. Oracle рекомендует поддерживать эту параллель и своим клиентам, однако Вы можете использовать и предыдущую версию oracle-клиента для подключения к текущей версии СУБД (и наоборот).
HINT: Кроме разных версий, oracle-клиент может входить в разные дистрибутивы. Если Вы установите на своём компьютере (на хосте) СУБД Oracle, то установщик автоматически установит и Oracle-клиент. Мы же СУБД запускаем в виртуальной машине, для хоста (либо другой виртуальной машины) нам понадобиться Oracle Instant Client.
Итак, скачиваем Instant Client – выбираем версию: так как мы будем запускать Win32 приложения, то и клиент должен быть Win32: Instant Client for Microsoft Windows (32-bit).
HINT: Даже если у вас ОС 64-битная, всё равно качаем 32-битную версию клиента; в будущем, если Вы будете делать сборки приложений под Win64, то можно также скачать и Win64 версию клиента.
Далее соглашаемся с лицензионным соглашением и выбираем версию *Instant Client Package - Basic Lite (18,4 Мб) – лайт версии нам вполне хватит. При желании можете скачать ещё *Instant Client Package - SQL*Plus – SQL Plus это консольная утилита для исполнения SQL-запросов, именно она чаще всего используется для иллюстрации примеров в книгах, документации и на форумах. Однако я буду использовать другую бесплатную утилиту, об этом чуть ниже.
Скачиваем zip-архив, однако из всего архива нам достаточно будет извлечь всего три файла (это легко выявляется экспериментальным путём):
- oci.dll
- orannzsbb11.dll
- oraociicus11.dll
Сохраняем их в отдельный каталог, например в C:\Oracle\InstantClient.
Настройка Oracle Instant Client
Для того, чтобы приложения смогли найти oci.dll, необходимо произвести одну настройку. На самом деле, можно поступить разными способами: есть приложения, у которых в настройках можно явно задать путь к oci.dll, но в основном приложения ищут библиотеку по некоторым правилам – сначала в реестре, затем в путях, указанных в переменной среды окружения Path. Сделаем именно это: жамкаем Win+Pause и далее находим слева пункт “Дополнительные параметры системы” (это для Windows 7, для Windows XP просто выбираем вкладку “Дополнительно”):
Жамкаем кнопку “Переменные среды…” и добавляем в переменную Path (через точку с запятой) путь к каталогу, куда мы распаковали архив (C:\Oracle\InstantClient). Сюда же добавляем переменную: TNS_ADMIN = C:\Oracle\InstantClient – это ссылка на каталог, где у нас будет лежать файл tnsnames.ora. Пусть это будет тот же каталог, где лежит oci.dll. У меня это всё выглядит так:
Здесь ещё можно указать NLS-параметры, подробнее о них можно почитать … мм, хотел вставить ссылку из своих закладок на хорошее описание, однако ресурс уже недоступен. На скорую руку нашёл такую интересную статью (ссылка). И ещё (ссылка).
Сохраняем изменения (ОК), для Windows XP Sp2 и ниже необходимо сделать выход из системы, чтобы эти переменные применились (ну или перезагрузить компьютер), для Windows XP Sp3 и Windows7 эти настройки применяются к текущему окружению сразу же (нужно лишь перезапустить файловый менеджер или проводник).
В принципе, на этом настройка Oracle Instant Client завершена, однако для удобства сделаем ещё одну вещь.
Настройка файла tnsnames.ora (не обязательно)
Создаём обычный текстовый файл под названием tnsnames.ora и сохраняем в каталог, на который ссылается переменная TNS_ADMIN. У нас этот файл будет содержать всего одну строку:
У меня приведён вариант с использованием упрощённого синтаксиса:
где alias – это имя, которое могут использовать приложения для подключения к БД (помните мы выбирали параметр Network Alias в предыдущей заметке, когда настраивали подключение к БД в Oracle SQL Developer?), host – IP-адрес сервера, я указал слово oracle, т.к. именно его мы прописали в файле hosts (а если не прописали, то здесь можно указать IP-адрес 192.168.56.101 явно), port – необязательный параметр, если не указать, то будет использован порт по-умолчанию 1521, sid – имя экземпляра БД, в нашем случае это orcl.
Более подробно об этом файле и как его конфигурировать – здесь.
Подключаемся к БД и выполняем запросы
Если же Вы не редактировали файл hosts и не создавали файл tnsnames.ora, то можно указать такие параметры:
Кнопка Test проверяет, можно ли подключиться к БД. Кнопка Save сохраняет введённые параметры в список слева. Кнопка Connect выполняет подключение к БД и закрывает диалог.
Выполняем простейший запрос:
И нажимаем F5, должно получиться примерно следующее:
Постскриптум
Вы наверное заметили, что “быстрый старт” – это мягко сказано: нам пришлось сделать как минимум три вещи. Если Вы не хотите заниматься всеми этими настройками, то можно поступить очень просто: скачать и установить дистрибутив СУБД Oralce для Windows, например бесплатную версию Oracle Database Express Edition 11g Release 2. При этом установщик автоматически за Вас сделает необходимую настройку Oracle-клиента. И Вам останется только запустить службу СУБД.
Однако я сознательно решил воспользоваться именно виртуальной машиной, чтобы показать на примере, с какими трудностями может столкнуться разработчик приложений под эту СУБД. Плюс, возможность использования виртуальных машин позволяет ставить СУБД (и другие виртуальные машины) на паузу, что происходит быстрее, чем остановка и запуск службы СУБД. Плюс это нам даёт такой “бонус” как перенос виртуальных машин с одной физической машины на другую. И ещё плюс – мы не “засоряем” хост-систему – “поигравшись” в разработчиков, достаточно удалить виртуальную машину и всё. Минус всей этой темы только один: СУБД в виртуальной машине работает чуть медленнее, чем на реальной физической машине, однако на сегодня, когда процессоры поддерживают виртуализацию на аппаратном уровне, это не существенно.
Уже много лет для управления предприятиями (заводами, фабриками, магазинами) человечество использует компьютеры, на которых, в качестве основного приложения, функционирует СУРБД (система управления реляционными базами данных). Они представляют огромное подспорье в управлении предприятиями, позволяя хранить, модифицировать (обновлять, редактировать, добавлять, удалять) терабайты информации. Воспользовавшись, затем, определённым инструментарием можно получать объективные отчёты по данным, хранящимся в БД.
Существует много различных СУРБД. Но так случилось (и этому способствовало много предпосылок), что в абсолютные лидеры (по популярности, распространённости и мощности) вырвалась одна из них. Называть её имя я пока не буду, а предложу лучше взглянуть на следующую иллюстрацию:
Рейтинг СУРБД на российском рынке
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 - программу, которая рассмотрена во второй части.
Читайте также: