В статье будет рассмотрена проблема, возникающая при попытке применения фильтра к ADO DataSet в среде Delphi XE2, связанная с использованием оператора LIKE и символа процента. Проблема заключается в том, что при использовании фильтра в виде Filter := '[Name] like ''%john''' происходит исключение EOleException, в то время как фильтр Filter := '[Name] like ''john%''' работает корректно. Рассмотрим подробнее причины возникновения ошибки и возможные способы её решения.
Причина ошибки
Ошибка возникает из-за того, что в ADO для оператора LIKE использование символа процента в качестве первого символа в критерии фильтра не поддерживается. Это означает, что процент должен стоять в конце строки или быть единственным символом в критерии, если вы хотите, чтобы фильтр соответствовал строкам, начинающимся с любого количества символов до указанной подстроки.
Возможные решения
Обновление компонентов ADO/MDAC. Возможно, проблема связана с устаревшим версией ADO или MDAC. Рекомендуется обновить компоненты до версии 2.8sp1.
Использование события OnFilterRecord. Можно переопределить обработчик события OnFilterRecord для выполнения собственной логики фильтрации.
procedure TForm1.ADODataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
iPos: Integer;
begin
iPos := Pos('john', ADODataSet1Name.FieldByName('Name').AsString);
if (iPos > 0) and (iPos + 3 = Length(ADODataSet1Name.FieldByName('Name').AsString)) then
Accept := True
else
Accept := False;
end;
Перемещение условия в SQL WHERE. Можно выполнить фильтрацию на уровне SQL, задав условие в WHERE clauses запроса и переоткрыв его.
Использование специфических приёмов базы данных. Например, создание дополнительной колонки, которая будет содержать последние 4 символа колонки Name, и использование этой колонки для фильтрации.
Query.SQL.Text := 'SELECT *, RIGHT(Name, 4) AS name_tail FROM table WHERE ...';
Использование символа звёздочки. Вместо процента можно использовать символ звёздочки *, который также является символом подстановки в SQL.
Filter := '[Name] like ''*john''';
Заключение
При использовании фильтрации данных в ADO DataSet важно помнить о правилах использования символов подстановки в операторе LIKE. В случае возникновения ошибок, следует внимательно изучить контекст использования фильтра и рассмотреть предложенные способы решения проблемы.
В статье рассматривается проблема с использованием оператора LIKE в ADO DataSet под Delphi XE2, связанная с неправильным позиционированием символа процента в фильтре и предлагаются способы её решения.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS