Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Фильтрация в компонентах доступа к данным (Delphi)

1.9K
26 декабря 2003 года
AviDen
91 / / 26.12.2003
Такой вопрос:
В Delphi для доступа к данным БД используется, в основном, компонент TTable (или его аналоги TADOTable, TSQLTable и пр.). У этих компонентов есть свойства Filter и Filtered, отвечаючие за фильтрацию выборки по строкам. Итак,
1) Я создаю пустое приложение, ложу туда, например TADOTable
2) Настраиваю подключение к серверу БД (у меня - SQL Server)
3) Выбираю имя таблицы в свойстве TableName, напр., MyTable
4) Задаю фильтр, например, "DocCode>='25.12.2003'" и устанавливаю свойство Filtered в True
5) Открываю таблицу
6) Если на шаге 5 посмотреть Trace-лог SQL-Server'а (я для этого пользуюсь утилитой MS SQL Profiler), то в нем будет не строка вида "SELECT * FROM MyTable WHERE DocCode>='25.12.2003'", а "SELECT * FROM MyTable", т.е. с сервера производится выборка не отфильтрованного набора данных, а полного.
7) Эксперименты с CursorType, LockType, другими библиотеками компонентов (TTable, TSQLSimpleTable) ничего не дали.

ИТОГ: Если у меня есть таблица с огромным числом записей, а я хочу открыть только небольшое их количество с исп. фильтра, то компонент доступа к данным все равно вытянет с сервера полный (неотфильтрованный) набор данных, а потом отфильтрует его локально. Тормоза при этом такие же, как если бы фильтра не было вообще. Побороть это невозможно, разве что пользоваться TQuery. Но это не подходит, т.к. там не свойств Filtered, Sort, MasterSource, которые так нужны! А писать своего наследника от TQuery некогда. :-( ...

Кто может хоть что-нибудь подсказать по этому поводу?
356
30 апреля 2006 года
molnij
159 / / 20.06.2000
1. Свойство filter\filtered изначально предназначено для фильтрации на клиенте и вообще появляется еще в TDataSet'e, используется обычно для фильтрации уже закаченных данных на клиенте, чтобы не перекачивать их каждый раз заново

2.Впервые слышу что в основном используется TTable :), имхо в основном используются как раз аналоги TQuery, так как дают куда большую функциональность.

3. У TQuery есть filter\filtered по причине описанной выше - он потомок TDataSet'a. Sort'a и MasterSource конечно нет... но это вполне покрывается языком SQL. А filter позволяет делать лишь относительно слабые условия выборки, ни о каких подзапросах там речи идти не может

4. Если сильно некогда, точно знаю, что в оракловых компонентах есть свойства которые позволяют добавлять вещи типа сортировки/упорядочивания к существующему запросу налету в полуавтоматическом режиме, возможно что-то подобное есть и для SQLServer'a, но имхо быстрее написать самому
1
01 мая 2006 года
kot_
7.3K / / 20.01.2000
Если нужна фильтрация - используй связку TADO...- TDataProvider - TClientDataSet - но имей ввиду - фильтрация данных буде на клиенте - если объем не большой - т.е. он НИКОГДА не превысит 15000 записей - то будет нормально. Если более 15000 - это ж0па. В противном случае использу то что тебе посоветовали - с одним уточнением - обязательно используй хранимые процедуры - и при этом учитывай - WITH RECOMPILE....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог