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