Фильтр TADOQuery и выражение всегда true - PullRequest
0 голосов
/ 12 января 2010

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

<space>AND field='value'

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

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

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

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

Ответы [ 3 ]

1 голос
/ 12 января 2010

Необходимо установить для свойства «Фильтр» значение «Ложь», если вы что-то не фильтруете, и установить для него значение «Истина» и свое условие, если вы хотите, чтобы набор результатов был отфильтрован.

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

1 голос
/ 12 января 2010

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

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

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

1 голос
/ 12 января 2010

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

...