Вопрос

Я пытаюсь отфильтровать некоторые записи из TADOQuery.Я установил для свойства filtered значение true, и когда я установил для фильтра значение field='value', все работает нормально.Я хотел бы динамически создать этот фильтр, добавив

<space>AND field='value'

к значению, которое всегда истинно, и я подумал, что 1=1 поможет.Поэтому я бы поставил 1=1 в качестве фильтра по умолчанию, а затем просто добавил бы AND field='value' к нему по мере необходимости.

Однако это не работает.Сообщение об ошибке гласит:

Аргументы имеют неправильный тип, выходят за рамки допустимого диапазона или конфликтуют друг с другом.

Может ли кто-нибудь сказать мне, что я могу использовать в качестве универсального, всегда истинного выражения для этого фильтра?

Это было полезно?

Решение

Полагаю, это само собой разумеется, но работает ли это или нет, зависит от поставщика OLE DB.Когда вы устанавливаете фильтр для существующего набора записей, он проходит через другой интерфейс OLE DB (IViewFilter, если я правильно помню).Таким образом, даже если фильтр работает в предложении WHERE оператора SQL, это не обязательно означает, что он будет работать как фильтр.Установленный вами фильтр в конечном итоге разбирается на части, а затем передается в интерфейс OLE DB.Возможно, реализация провайдера не ожидает фильтр вида «константа = константа».В качестве обходного пути вы можете попробовать установить все это в предложении WHERE оператора SQL.

Другие советы

Вам необходимо установить для свойства Filtered значение False, если вы что-то не фильтруете, и установить его True и свое условие, когда вы хотите, чтобы набор результатов был отфильтрован.

Я бы динамически создавал правильное свойство SQL, чтобы вы всегда точно знали, что отправляется в базу данных (и вы были уверены, что ваша программа получает только те записи, которые вам нужны).

Трюк 1=1 отлично работает в предложенииwhere запроса, но не в свойстве filtered.Если вы хотите отключить фильтр, установите для фильтра значение false, и все записи будут возвращены.

Проблема с фильтрацией в том, что она выполняется на стороне клиента.Если вы используете механизм базы данных, такой как SQL Server, и ожидаете, что у вас будет большой набор записей для фильтрации, то вам лучше изменить SQL-запрос, который позволит серверу базы данных возвращать только запрошенные записи.Просто не забудьте сначала закрыть TAdoQuery, изменить SQL, а затем снова открыть.

Уловка, которую я использую, чтобы избежать возврата всего набора данных (используется для больших наборов данных), заключается в том, чтобы учитывать максимальное количество записей, которые я хочу отобразить, а затем использовать синтаксис TOP SQL, чтобы вернуть на одну больше, чем количество записей, которые я хотел отобразить 'n ' ... если я достигну этого числа, я уведомлю пользователя о том, что было возвращено более n-1 записей, и скорректирую критерии поиска/фильтрации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top