Здравствуйте, Kostik00.
K>Давай разберемся
Доктору, исцелился сам
K>Куда отдаеш (Пользователю на экран?) и что с ними делаеш?
Отдаю данные в программу с весёлым названием ГОПА — графическая оболочка просмотра архивов (это не шутка, так в ТЗ!) SCADA-системы.
K>Обычно на экран отдается первая порция — а там постепенно подкачивается остальное (Такое делал здесь и ненадо никаких супер наворотов) — но милион записей — это слишком.
Для SCADA-систем миллион записей — это только закусить перед завтраком. Цикл опроса может быть (например) 1 мс, то есть с одного датчика получаем 1000 значений в сек, а всего этих приборов — легко может быть и сотня, и много больше.
Ну, это к слову. Непосредственно же решение оказалось простым, как грабли. И очень похоже на то, что предлагал Коваленко Дмитрий (см. выше в этой ветке). Данные получаются порциями по N строк. Полученная порция ставится в очередь на "отдачу", а другой поток эту очередь разгружает. И всё это в цикле, пока все данные не приплывут с сервера.
Собственно получение порций данных реализовано так:
1) IRowset::GetNextRows()
2) IRowset::GetData()
3) IRowset::ReleaseRows()
Самое весёлое, что никакие средства асинхронной обработки OLE DB не потребовались.