Добрый день, столкнулся с задачей у которой по-идеии должно быть "изящное" решение, ну что-то не найду.
Я из БД, посредсвом АДО, получаю довольно большой рекордсет и нужно его отобразить в диалоговом окне.
Из-за объемов обычный list ctrl не подходит, поэтому делаю его виртуальным и в Getdispinfo() отображаю данные. Только вот собственно вопрос, для отображения я предварительно копирую данные из рекордсета в свой вектор и потом уже в Getdispinfo() по индексу в векторе выбираю данные, но при таком варианте тратится время на преварительное копирование данных из полученного рекордсета в мой вектор. Может есть способсразу отображать АДОшный рекордсет в виртуальном списке, т.е. есть ли возможность получить данные из АДО.Рекордсет по номеру записи?
Здравствуйте, .alex, Вы писали:
A>Может есть способсразу отображать АДОшный рекордсет в виртуальном списке, т.е. есть ли возможность получить данные из АДО.Рекордсет по номеру записи?
Это скорее зависит от БД, с которой идет взаимодействие через ADO.
Например, для dbf есть возможность рандомного доступа, а для большинства серьезных СУБД — только последовательный доступ.
Виртуальный ListCtrl умеет запрашивать данные только по индексу, а также заранее надо знать количество записей чтобы вызвать SetItemCountEx.
Это накладывает серьезные ограничения на непосредственное взаимодействие с СУБД.
Если проблему с размером выборки как-то решить, то можно подгружать данные из БД порциями в небольшой кэш (то же вектор, к примеру).
Для оптимизации заполнения кэша есть специальное сообщение LVN_ODCACHEHINT, где приходит диапазон индексов строк, которые будут в дальнейшем запрашиваться через LVN_GETDISPINFO.
Для поддержки такой "прокрутки" некоторые СУБД поддерживают специальные инструкции в SELECT.
Например, в PostgreSQL есть пара инструкций OFFSET/FETCH (
PostgreSQL 9.5.24 Documentation).