Поиск в базе данных в Delphi

Самым распространенным вопросом при работе с базами данных является поиск нужных записей по какому-либо критерию. В Delphi много компонентов ADOExpress, которые включают в себя различные методы поиска записей, которые аналогичные, используемым в BDE.

Самым распространенным вопросом при работе с базами данных является поиск нужных записей по какому-либо критерию. В Delphi много компонентов ADOExpress, которые включают в себя различные методы поиска записей, которые аналогичные, используемым в BDE.

Наиболее часто алгоритм поиска строится по одной схеме: поиск начинаем с начала таблицы, далее проверяем поле каждой строки и останавливаем цикл на найденной записи. Существует несколько способов расположения данных, которые получены из БД при помощи компонента ADODataset, которые мы и рассмотрим.

Locate: данный метод является универсальным, он устанавливает текущую запись в виде первой строки. Используя данный, метод можно искать значения как одного, так и более полей, которые размещены в массиве переменных (подробности см. на форуме delphi).

Lookup: такой метод не перемещает курсор в нужную строку, а занимается только возвращением её значения. Lookup возвращает переменные в массиве, показывая список значений из полей, разделённый точкой с запятой, которые необходимо возвратить из интересующей нас строки. В том случае, если по запросу не найдено ни одной строки, то Lookup вернёт пустую переменную.

Как выяснили на форуме программистов, главным преимуществом ииспользования методов Locate и Lookup является то, что они не требуют индексации таблицы. Хотя с проиндексированной таблицей Locate будет работать быстрее.

Индексирование в большинстве случаев помогает намного быстрее находить и сортировать. При этом можно создавать индексы либо на одном, либо на нескольких полях. Следует упомянуть, что в таблице первичный ключ уже автоматически проиндексирован, не менее важно то, что индексировать поля с типом данных OLE Object невозможно. Дополнительно необходимо знать то, что если многие из значений в поле одинаковы, то индексирование нисколько не ускорит процесс получения данных из базы.

BDE Delphi предоставляет некоторые функции для работы с таблицами БД, которые разрешают производить поиск нужных значений. Приведем примеры таких функций: FindKey, Goto, GoToNearest, GoToKey, Find, Find Nearest и другие. ADO же напротив данные методы не поддерживает, а взамен предлагает метод Seek.

Seek - данный метод в ADO применяет индекс для поиска данных. Хотя тот же Access при поиске в базе данных, если не имеет заданный индекс, то использоваться будет Первичный индексный ключ. Seek применяется для поиска записей с конкретным значением в поле. Если Seek не находит необходимую строку, то ошибка не выдаётся, курсор просто устанавливается в самый конец данных.

В компоненте TADOTable метод GetIndexNames возвращает список индексов для таблицы. Этот же список также доступен в свойстве IndexName компонента TADOTable. В качестве альтернативного может использоваться свойство IndexFieldNames, здесь указывается имя каждого поля, которые применяются в таблице.

Метод Seek может быть определен так: function Seek(const KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean; KeyValues значений Variant. В связи с тем, что индекс состоит из одного или больше столбцов, то сам массив будет содержать значения, сравниваемые с соответствующими столбцами:

  • SeekOption - тип сравнивания между колонками;
  • soFirstEQ – запись, позиционирующаяся в первую нужную строку либо в конец таблицы;
  • soLastEQ - запись, позиционирующаяся в последнюю нужную строку либо в конец таблицы;
  • soAfter – запись, позиционирующаяся в ту строку, которая следует за нужной;
  • soBefore – запись, позиционирующаяся в ту строку, которая стоит перед нужной.

Автор: Александр Абрамов.

Тематики: Интернет, ПО, Web

Ключевые слова: Delphi, database, search