Поместить ADO.RecordSet на VirtualListCtrl
От: .alex Ниоткуда  
Дата: 16.11.20 11:29
Оценка:
Добрый день, столкнулся с задачей у которой по-идеии должно быть "изящное" решение, ну что-то не найду.
Я из БД, посредсвом АДО, получаю довольно большой рекордсет и нужно его отобразить в диалоговом окне.
Из-за объемов обычный list ctrl не подходит, поэтому делаю его виртуальным и в Getdispinfo() отображаю данные. Только вот собственно вопрос, для отображения я предварительно копирую данные из рекордсета в свой вектор и потом уже в Getdispinfo() по индексу в векторе выбираю данные, но при таком варианте тратится время на преварительное копирование данных из полученного рекордсета в мой вектор. Может есть способсразу отображать АДОшный рекордсет в виртуальном списке, т.е. есть ли возможность получить данные из АДО.Рекордсет по номеру записи?
Re: Поместить ADO.RecordSet на VirtualListCtrl
От: qaz77  
Дата: 17.11.20 15:31
Оценка:
Здравствуйте, .alex, Вы писали:

A>Может есть способсразу отображать АДОшный рекордсет в виртуальном списке, т.е. есть ли возможность получить данные из АДО.Рекордсет по номеру записи?


Это скорее зависит от БД, с которой идет взаимодействие через ADO.
Например, для dbf есть возможность рандомного доступа, а для большинства серьезных СУБД — только последовательный доступ.

Виртуальный ListCtrl умеет запрашивать данные только по индексу, а также заранее надо знать количество записей чтобы вызвать SetItemCountEx.
Это накладывает серьезные ограничения на непосредственное взаимодействие с СУБД.

Если проблему с размером выборки как-то решить, то можно подгружать данные из БД порциями в небольшой кэш (то же вектор, к примеру).
Для оптимизации заполнения кэша есть специальное сообщение LVN_ODCACHEHINT, где приходит диапазон индексов строк, которые будут в дальнейшем запрашиваться через LVN_GETDISPINFO.

Для поддержки такой "прокрутки" некоторые СУБД поддерживают специальные инструкции в SELECT.
Например, в PostgreSQL есть пара инструкций OFFSET/FETCH (PostgreSQL 9.5.24 Documentation).
Re: Поместить ADO.RecordSet на VirtualListCtrl
От: VladFein США  
Дата: 17.11.20 20:25
Оценка:
Здравствуйте, .alex, Вы писали:

A>Из-за объемов обычный list ctrl не подходит, поэтому делаю его виртуальным и в Getdispinfo() отображаю данные.


Может off-topic, но что будет пользователь делать с таким большим листом? Прокручивать в надежде увудеть нужную строку?

Можно показать 10 (20? 100?) строк и намекнуть что есть еще 100500. Уточнить запрос?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.