Getting Started.
Это - курсовая работа по Delphi. В ней рассматривается использование базы данных, созданной в Access, в программах Delphi.
Создадим новый проект:
Рисунок 1: Стартовая площадка
Базу данных мы будем использовать ту, что я приготовил для курсовой по базам данных. Итак, нас интересует вкладка, имеющая название ADO (от англ. ActiveX Data Objects — «объекты данных ActiveX»).
Рисунок 2: Вкладка ADO
Базовый компонент, осуществляющий соединение с базой данных - TADOConnection. Это невизуальный компонент, который мы видим только в режиме конструктора. Да и видеть нам его незачем - он выполняет только функцию соединения с базой данных. Имеет следующие важные свойства (не в алфавитном порядке, а в последовательности настройки):
- ConnectionString - строка с параметрами соединения. Двойной щелчек откроет диалоговое окно настройки соединения. Но об этом позже.
- Login Promt - спрашивать ли логин и пароль при каждом соединении.
- Connection Timeout - сколько времени ждать ответа от базы данных. Пригодится, если ваше приложение взаимодействует с базой данных на удалённом сервере.
- Connected - если True, то компонент подключен к базе данных. Изменение параметров присвоит ему значение False, поэтому если нужно донастроить компонент - не забудьте выставить True в этом свойстве
Итак, вернемся к ConnectionString. После двойного клика на поле значений откроется нам вот такое окно:
Рисунок 3: ConnectionString - ручное введение
Если вы помните параметры наизусть, то можно вводить значение в ConnectionString вручную. Вот только печатать много и велика вероятность ошибки, да и зачем, если есть удобный мастер построения этой строки. Нажимаем кнопку Build:
Рисунок 4: ConnectionString - мастер построения, шаг 1
Базы данных Microsoft Access 2003 работают под управлением поставщика Microsoft Jet 4.0 OLE DB Provider.
Рисунок 5: ConnectionString - мастер построения, шаг 2
Выбираем местонахождение базы данных. В поля "Пользователь" и "Пароль" вводим логин и пароль от вашей базы данных.Жмём дважды OK. Всё, соединение с базой данных настроено.
Важное замечание! Если вы собираетесь переносить ваш проект, то из-за того, что мастер записывает в свойства объектов абсолютный путь к базе данных, проект придется перекомпилировать на каждом новом компьютере с указанием нового пути. Чтобы избавиться от этого, нужно изменить абсолютный путь на относительный в Connection String. Будьте внимательны! Не затроньте других параметров!
Ну и теперь мы можем включить соединение. Для этого в свойство Connected запишем True.
К базе данных мы присоединились. Пора сделать то, ради чего мы к ней соединялись - использовать данные. Для этого существует компонент TADODataSet.
- Пиктограмма компонента TADODataSet. Находится на вкладке ADO рядом с TADOConnection.
Важные свойства компонента TADODataSet:
- CommandText - SQL запрос на выборку, результат которого мы будем отображать
- Connection - указатель на соединение с базой данных, TADOConnection
- Active - если True, то активен. После изменения свойств не забывайте ставить это свойство в True
Двойной щелчок в поле значения свойства CommandText откроет нам такое окно:
Рисунок 6: Составляем запрос
Двойной щелчок на имени таблицы добавит таблицу в запрос. Ну а двойной щелчок по имени поля добавит поле в запрос. Кстати, в списке таблиц так же отображаются запросы. Вот только модифицировать ничего нельзя. Запрос в этой строке полностью поддерживает синтаксис SQL. После модификации строки запроса не забудьте выставить Active = true, иначе не увидите результатов запроса.
Настало время посмотреть, что у нас получилось. Переходим на вкладку Data Access, выбираем компонент TDataSource. Единственное свойство этого компонента, которым мы будем пользоваться - DataSet. Выбираем наш предварительно настроенный DataSet из списка.
Важное замечание! У компонента DataSet так же существует свойство DataSource. Не поддаёмся на искушение и оставляем это поле пустым.
Переходим на вкладку Data Controls. На этой вкладке расположены объекты, с помощью которых мы сможем получить доступ к данным. Сейчас нас интересует компонент TDBGrid - обычная двухмерная таблица .
Рисунок 7: TDBGrid на форме
Важные свойства компонента TADODataSet:
- DataSource - указатель на TDataSource
- Columns - столбцы таблицы
Выбираем в свойстве DataSource предварительно настроенный компонент. И в таблице DBGrid мы видим результат нашего запроса.
Рисунок 8: TDBGrid в действии
Приложение готово к работе.
Lookup поля
Итак, мы вполне уверенно вытаскиваем данные из таблиц. Но при многочисленных связях - а в базе данных в третьей нормальной форме их будет достаточно много - таблица будет пестрить многочисленными числовыми индексами, малопонятными обычному пользователю. Обратим внимание на рисунок 8 и рисунок 9. На рисунке 8 в поле Тип_памяти мы видим числовые индексы, когда как в Access у нас удобно подставляются данные.
Рисунок 9: Подстановка в Ms Access
Существует два варианта это сделать в Delphi. Первый вариант - использовать SQL запрос:
select Интерфейс, Память, Название as Тип_памяти from Видеокарты, Тип_ОЗУ_Видеокарты WHERE Тип_памяти = Тип_ОЗУ_Видеокарты.id
Не забыли куда писать этот запрос? Конечно в свойство CommandString компонента ADODataSet. Не забываем включить свойство Active после изменения запроса. Итак, нашим взглядам предстает такая картина:
Рисунок 10: Результат выполнения запроса
Итак, теперь по порядку. Мы выбираем данные из двух таблиц. Но если просто указать select Интерфейс, Память, Название as Тип_памяти from Видеокарты, Тип_ОЗУ_Видеокарты, то для наших трёх записей мы получим девять записей - выберутся все возможные варианты пересечения между таблицами. А так выберутся только те записи, где тип_памяти видеокарты равен id в списке типов памяти видеокарт.
Важное замечание! Для таких операций лучше использовать JOIN
Запускаем проект. Всё отображается, работает. Но давайте попробуем изменить данные или же добавить.
Рисунок 11: Вот что бывает, когда пытаешься изменить данные
Скорее всего это как-то лечится. Но как - я еще не разобрался. Поэтому мы применим магию Lookup полей для возможности корректного редактирования. Это и есть второй вариант отображения значений вместо индексов. Делается lookup поле в несколько шагов:
- Шаг 1: Добавляем еще один DataSet, настраиваем его на наше соединение, а в commandText прописываем выборку всех записей таблицы со значениями. Запрос будет примерно таким:
select * from Тип_ОЗУ_Видеокарты. Не забываем выставить свойство Active в True. - Шаг 2:
Рисунок 12: Нажмём на крестик рядом с DataSet
Нажмём на крестик рядом с DataSet - раскроется подобный список. Нас интересует Fields - нажмём правой кнопкой мыши и выберем "Add All Fields". Проделаем это с двумя нашими DataSet'ами.
- Шаг 3:
Рисунок 13: Добавление нового поля
Правой кнопкой мыши на Fields -> New Field. Появится диалог создания нового отображаемого поля.
Важное замечание! Все операции с Fields внутри DataSet'ов не влияют на структуру самой базы данных.
Вписываем название. Поле Component заполнится самостоятельно. Так же выбираем тип поля, в моём случае это String. Среди трёх RadioButton выбираем Lookup - это значит, что значение поля мы будем выбирать из другого места. Key Fields - поле, которое содержит значения. Dataset - выбираем результирующий DataSet. Lookup Keys - поле, с которым сравниваем, обычно поле со счетчиком. Result Field - поле, значение которого мы будем показывать.
Результаты:
Рисунок 14: Результат в режиме конструктора
Рисунок 15: Результат в скомпилированном приложении
А самое главное, что всё без проблем редактируется.
Итак, в этой небольшой статье я рассмотрел основные принципы взаимодействия базы данных, спроектированной в MS Access, с Delphi. Удачи в написании собственных приложений!
Ключников Александр, 2010.