Опубликован: 07.05.2010 | Уровень: специалист | Доступ: платный
Лекция 2:

ADO. Связь с таблицей MS Access

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Аннотация: На этой лекции мы поговорим о механизмах доступа к данным BDE и ADO, обсудим их плюсы и минусы. Создадим базу данных с помощью программы MS Access. Затем создадим приложение, которое работает с этой базой данных, используя механизм ADO.

С самого появления технологии баз данных программисты испытывали потребность в механизмах доступа к этим самым данным. Различные компании по-своему пытались предоставить им такую возможность. Например, для работы с таблицами типа dBase была создана Система Управления Базами Данных ( СУБД ) Clipper. Для времен операционной системы MS-DOS - превосходное решение. Однако Clipper не мог работать ни с какими другими типами таблиц. И чем больше типов данных появлялось, тем острее вставала необходимость разработать универсальный инструмент доступа, который мог бы работать с любым типом данных.

Механизм доступа к данным - это программный инструмент, позволяющий получить доступ к базе данных и ее таблицам. Как правило, это драйвер в виде *.dll файлов, который устанавливается на ПК разработчика (и клиента), и который используется программой для связи с БД.

Сравнение BDE и ADO

Borland Database Engine (BDE) - первая такая разработка фирмы Borland. Этот механизм доступа к данным позволяет обращаться к локальным и файл-серверным форматам баз данных dBase, FoxPro и Paradox, к различным серверам SQL и ко многим другим источникам данных, доступ которых поддерживался при помощи драйверов ODBC. Например, с помощью BDE можно напрямую работать с табличными файлами MS Excel. Увы, механизм доступа BDE признается устаревшим даже самой компанией Borland. В данный момент многие инструменты Delphi являются кросс - платформенными, то есть, программы с небольшими доработками можно переносить на другие операционные системы. Корпорация Borland выпустила новую среду быстрой разработки программ - Kylix, на которой создаются приложения для операционных систем семейства Linux. Часто говорят, что Kylix - это Delphi для Linux. Так и есть - если вы умеете программировать на Delphi, сумеете и на Kylix. Большинство инструментов Delphi были унаследованы Kylix, но, увы, не BDE. Дальнейшее развитие этого механизма доступа к данным корпорацией Borland прекращено.

Тем не менее, хоронить его рано. Многие программисты до сих пор используют данный инструмент в разработке приложений для небольших компаний. Да что там говорить, китайская компания Huawei, разрабатывающая современнейшие электронные АТС как для городских, так и для мобильных телефонов, до сих пор использует BDE для доступа к настройкам и статистическим данным этих АТС! Кроме того, BDE имеет множество простых и удобных возможностей для программиста, таких например, как создание таблиц программно.

Удобство работы с BDE трудно переоценить, однако нельзя не сказать и о минусах. Основной минус - распространение приложений. Если ваше приложение использует для доступа к данным компоненты BDE, то и у клиента, который будет пользоваться вашей программой, должен быть установлен BDE. Причем если вы использовали алиасы (псевдонимы базы данных), то настройка на эти же алиасы должна быть и у клиента. Впрочем, создание инсталляционного пакета при помощи стандартной утилиты Install Shield Express снимает эту проблему. Эта утилита позволяет включать настроенный механизм BDE в состав инсталляционного пакета вашей программы. Конечно, за это приходится расплачиваться большими размерами инсталляционного файла.

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

На предыдущем курсе "Введение в программирование на Delphi " мы затрагивали работу с базами данных посредством BDE. Больше к этим темам мы возвращаться не будем, хотя изредка будем обращаться к BDE, чтобы продемонстрировать те или иные возможности, отсутствующие в других механизмах доступа к данным, или отличающиеся от них. Поэтому если вы пропустили этот курс, то хотя бы бегло просмотрите работу с BDE в лекциях 29-32.

ActiveX Data Object (ADO) - это механизм доступа к данным, разработанный корпорацией Microsoft. Если точнее, то ADO - это надстройка над технологией OLE DB, посредством которой можно связываться с различными данными приложений Microsoft. В середине 1990-х годов большое развитие получила технология COM, и корпорация Microsoft в связи с этим объявила о постепенном переходе от старой технологии ODBC к новой OLE DB. Однако технология OLE DB достаточно сложная, использование этой технологии происходит на системном уровне и требует от программиста немало знаний и труда. Кроме того, технология OLE DB очень чувствительна к ошибкам, и "вылетает" при первом удобном случае. Чтобы облегчить программистам жизнь, корпорация Microsoft разработала дополнительный прикладной уровень ADO, который мы будем изучать на этом курсе.

По своим возможностям ADO напоминает BDE, хотя конечно, является более мощным инструментом. Компания Borland разработала набор компонентов для доступа к ADO и первоначально назвала его ADOExpress. Однако корпорация Microsoft упорно противится использованию своих обозначений в продуктах сторонних разработчиков, поэтому, начиная с Delphi 6, этот набор компонентов стал именоваться dbGo. Эти компоненты вы можете увидеть на вкладке ADO палитры компонентов.

Технология ADO, как и BDE, независима от конкретного сервера БД, имеет поддержку как локальных баз данных различных типов, так и некоторых клиент-серверных БД. Плюсов у этой технологии много. Драйверы, разработанные корпорацией Microsoft для собственных нужд, более надежные, чем драйверы сторонних производителей. Поэтому если вам требуется работать с базами данных MS Access или для архитектуры клиент-сервер использовать MS SQL Server, то использование ADO будет наиболее предпочтительным. Кроме того, имеется плюс и в вопросе распространения программ - во всех современных Windows встроены драйверы ADO. Другими словами, ваша программа будет работать на любом ПК, где установлен Windows.

Как ни странно, но основной минус так же заключается в вопросе распространения программ. Корпорация Microsoft поступает довольно хитро. Каждые пару-тройку лет появляются новые версии Windows. Рядовому пользователю обычно нет нужды переходить на свежую ОС, тем более что каждая новая система становится все требовательней к ресурсам ПК. Для того чтобы заставить пользователя перейти на новую версию, корпорация Microsoft обязательно вводит несколько новых стандартов или технологий, несовместимых со старыми. А для старых версий доработок не предусматривается. Вот и приходится бедному пользователю скрепя зубы тратиться на новые версии операционной системы и пакета MS Office. Поэтому при использовании технологии ADO приходится думать о том, какая версия Windows стоит у конечного пользователя, будет ли ваша программа работать у него на ПК.

Технология ADO на самом деле является частью Microsoft Data Access Components (MDAC). Компания Microsoft распространяет MDAC как отдельный продукт, к счастью, бесплатный. При этом поддерживается только самая последняя версия MDAC. Например, в состав Delphi 7 входит MDAC 2.6. При распространении собственных программ следует учитывать, что у клиента с большей долей вероятности уже установлена эта самая MDAC, причем самой последней версии. Однако если он пользуется старыми версиями Windows (Win95, 98, ME, NT), то вам потребуется позаботиться об установке MDAC на его компьютер. Если же у него установлена ОС Win2000, WinXP или более новая, то MDAC у него уже есть, и вам беспокоиться не о чем.

Еще один серьезный минус ADO в том, что он для подключения к БД использует довольно медлительную технологию COM. Если ваша база данных будет содержать несколько тысяч записей, то скорость работы с таблицами может стать в сотни раз более медленной, чем если бы вы использовали BDE! На современных ПК, имеющих частоту процессора до 2 ГГц и выше, эти замедления могут быть и незаметны, но работа с огромной базой данных на более медленных ПК превратится в сплошное ожидание.

Основными компонентами, с которыми нам предстоит работать, являются TADOConnection (для подключения к БД), TADOTable (аналог TTable из BDE ), TADOQuery (аналог TQuery из BDE, для выполнения запросов и получения набора данных) и TADODataSet (предназначенный для набора данных, полученных через SQL-запрос).

Создание базы данных MS Access

Базы данных MS Access имеют много плюсов, часто программисты предпочитают использовать именно их. Во-первых, база данных MS Access - это один файл. Сколько бы таблиц и индексов она не содержала, все это хранится в одном единственном файле. А значит, такую базу данных легче обслуживать - переносить на новое место, делать резервные копии и так далее. Еще один плюс - имена полей в такой БД можно давать русскими буквами.

Лучше всего изучать новый материал на практике. Для примера создадим базу данных для отдела кадров какого-нибудь предприятия. Какие данные на сотрудника нам понадобятся? Прежде всего, фамилия, имя и отчество. Затем укажем пол (мужской или женский), семейное положение (холост или женат/замужем), количество детей. Также понадобятся дата рождения и дата поступления на работу. Стаж работы в годах. Образование. Военнообязанный сотрудник, или нет. Телефоны, по которым можно связаться с сотрудником в любое время. Должность сотрудника и отдел (если есть), в котором он числится. А также его домашний адрес. При этом учитываем, что сотрудник не обязательно является жителем города, где он работает. А вдруг он приехал на заработки из другого города? Или даже из другой страны? Следовательно, придется вводить и страну, и город - вдруг потребуется делать отчет по сотрудникам, прописанным в Украине, например? Вот сколько данных нужно будет вводить для отдела кадров! А ведь мы еще немного упростили их. Стаж работы подразделяется на общий и непрерывный. Эти данные учитываются при расчете больничных листов. Но для учебной базы данных такими деталями можно пренебречь.

Итак, первым делом оптимизируем данные, исходя из правил трех нормальных форм. В результате получаем целых четыре таблицы:

Оптимизированные таблицы

Рис. 2.1. Оптимизированные таблицы

Главной здесь будет таблица LichData, которая содержит основные данные о сотруднике. Она имеет релятивные связи с другими таблицами. Поле "Ключ" будет автоинкрементным, то есть автоматически будет прибавляться на единицу, гарантируя нам уникальность ключа. В подчиненных таблицах имеется поле "Сотрудник" целого типа, по которому будет обеспечиваться связь. Причем ключевых полей в дочерних таблицах не будет.

Главная таблица поддерживает связь один-к-одному с таблицами Doljnost и Adres, и связь один-ко-многим с таблицей Telephones, ведь у сотрудника наверняка есть и домашний, и рабочий телефоны, а в карманах, возможно, лежит пара мобильников. То есть, один сотрудник может иметь много телефонов.

С полями и связями определились, пора создавать базу данных. Для этого загрузите программу MS Access.

Если в правой части окна у вас нет панели "Создание файла", то выберите команду "Файл -Создать". Затем выберите команду "Новая база данных". Сразу же выйдет запрос с именем этой базы данных. Создайте папку, которая все равно нам понадобится для нового проекта, укажите эту папку, а базу данных назовите ok (отдел кадров). Как только вы нажмете кнопку "Создать", появится окно этой базы данных:

Создание БД

Рис. 2.2. Создание БД

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

  1. "Ключ". Разумеется, имя поля пишем без кавычек. Выбираем тип данных "Счетчик", это автоинкрементный тип данных. В настройках убедитесь, что поле индексированно - Да (Совпадения не допускаются). Правой кнопкой щелкните по этому полю и выберите команду "Ключевое поле". Слева от поля появится значок ключа.
  2. "Фамилия". Тип поля текстовый, размер 25 символов. Индексированное поле - Да (Совпадения допускаются). Ведь могут же попасться родственники или однофамильцы!
  3. "Имя". Тип поля текстовый, размер 25 символов. Индексированное поле - Да (Совпадения допускаются).
  4. "Отчество". Тип поля текстовый, размер 25 символов. Индексы не нужны.
  5. "Пол". Текстовый, размер 3 символа. В формате поля укажите "муж/жен", конечно, без кавычек.
  6. "Сем_Полож". Логический тип, формат поля "Да/Нет". Здесь мы будем указывать, состоит ли сотрудник (сотрудница) в браке.
  7. "Детей". Числовой тип, размер поля Байт (трудно представить, что у кого-то будет более 255 детей!).
  8. "Дата_Рожд". Тип поля - Дата/Время. Выберите формат "Краткая форма даты". Затем выберите тот же формат для поля "Маска". При попытке выбора маски выйдет запрос на подтверждение сохранения таблицы. Ответьте утвердительно, а вместо имени таблицы по умолчанию "Таблица 1" впишите " LichData ", так будет называться наша первая таблица. После этого появится окно создания маски ввода. Выберите "Краткий формат даты", нажмите "Далее", после чего в окне "Маска ввода" наберите "00.00.0000". В результате мы будем иметь маску в виде "дд.мм.гггг".
  9. "Дата_Пост". Все то же самое, что и в №8.
  10. "Стаж". Тип поля числовой, размер - байт.
  11. "Образование". Текстовый, размер поля 30 символов. Ведь здесь может быть и длинный текст, например "неоконченное высшее техническое".
  12. "Военнообязанный". Логический тип, формат "Да/Нет".

В результате получим такую картину:

Поля таблицы LichData

Рис. 2.3. Поля таблицы LichData

При попытке закрыть это окно, выйдет запрос о сохранении таблицы " LichData ". Ответьте утвердительно. Главная таблица сделана, осталось еще три.

Снова щелкаем "Создание таблицы в режиме конструктора". Вводим такие поля:

  1. "Сотрудник". Тип поля - числовой, размер поля - длинное целое. Делать это поле ключевым не нужно, даже после того, как при попытке закрыть таблицу Access предложит вам сделать поле ключевым.
  2. "Отдел", Текстовое, 15 символов.
  3. "Должность", Текстовое, 20 символов.

Закрываем таблицу, даем ей имя " Doljnost ", отказываемся от создания ключа.

Делаем следующую таблицу. Поля:

  1. "Сотрудник". Тип поля - числовой, размер поля - длинное целое. Не ключевое.
  2. "Страна". Тип текстовый, размер 15.
  3. "Город". Тип текстовый, размер 20.
  4. "Дом_Адрес". Тип текстовый, размер 100.

Закрываем таблицу, даем имя " Adres ", отказываемся от создания ключа.

Делаем следующую таблицу. Поля:

  1. "Сотрудник". Тип поля - числовой, размер поля - длинное целое. Не ключевое.
  2. "Телефон". Тип текстовый, размер 17. Желательно задать маску. Сразу же выйдет запрос о сохранении таблицы, сохраните ее под именем " Telephones ". Для этого выбираем маску (дважды щелкаем по ней), в окне нажимаем кнопку "Список". Настраиваем маску, как на рисунке:
    Маска для телефона

    Рис. 2.4. Маска для телефона
  3. "Примечание". Тип текстовый, размер 10. Формат "Рабочий/Домашний/Мобильный".

Закрываем таблицу " Telephones ", отказываясь от создания ключевого поля.

Все, база данных готова. Программу MS Access можно закрыть, больше она не понадобится. Пока база данных еще пустая, желательно сделать резервную копию файла ok.mdb, который и является полученной базой данных. Как видите, никаких связей между таблицами мы не делали - проще будет сделать их в проекте программы.

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Денис Попов
Денис Попов
Россия, Оренбург, Оренбургский государственный университет, 2015
Рустам Кадыров
Рустам Кадыров
Россия, Тирлян, Тирлянская школа №5, 2003