DBGrid с возможностью чтения вперед с использованием ADO - PullRequest
3 голосов
/ 17 декабря 2011

Я работаю с ADO, подключающимся к SQL Server 2005.

Мой TADODataSet выбирает 1 миллион записей.Использование TDBGrid и установка TADODataSet.CursorLocation на clUseServer работает.но TDBGrid дросселирует!

Как я могу выбрать 1 миллион записей, избежать подкачки страниц и при этом иметь возможность отображать записи в сетке без извлечения ВСЕХ записей на стороне клиента, позволяя Грид читать вперед при прокруткеи вниз?

Диспетчер предприятия SQL может выполнить запрос и асинхронно выбрать 1 миллион записей без каких-либо проблем (также MS-ACCESS).

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

TGrid это не ваша проблема.Ваша проблема в том, что TADODataset пытается загрузить все записи.Если вам нужно выполнить запрос, который возвращает так много записей, вы должны установить ExecuteOptions, попробовать eoAsyncExecute и eoAsyncFetch.Это также может помочь установить CacheSize.

1 голос
/ 18 декабря 2011
  • Зачем вам нужно извлекать 1M записей в сетку?Ни один человек не может смотреть на столько записей.Обычно гораздо лучше уменьшить количество записей перед их загрузкой в ​​пользовательский интерфейс.
  • Если у вас есть веская причина показывать столько таблиц в сетке, вам понадобится набор данных, который 1) не загружает весь набор записей при открытии 2) не кэширует предыдущую запись или может исчерпать память (особенно под 32-битной Windows) задолго до достижения конца набора записей, еслиРазмер записи не достаточно мал.Чтобы получить такой результат за пределами CursorLocation, необходимо правильно установить CursorType и CacheSize.
  • Вы можете использовать TClientDataset для реализации инкрементальной выборки, задав для набора данных ADO CursorType значение ForwardOnly и CacheSize для подходящего значения.Поскольку TClientDataset кэширует прочитанные записи, вы должны избегать того, чтобы исходный набор данных также загружал их все.Для стандартной сетки БД требуется двунаправленный курсор, поэтому он не будет работать с однонаправленным.При таком количестве записей, кэш набора данных клиента может исчерпать память в любом случае.Я бы предложил использовать Midas Speed ​​Fix unit , если вы используете версию Delphi до 2010 года.
  • Чтобы избежать ошибок «нехватки памяти», вам может потребоваться реализовать какой-тонумерацией страниц.В любом случае, проверьте, может ли поведение другого CursorType помочь вам.
0 голосов
/ 18 декабря 2011

Вы можете попробовать AnyDAC и TADTable.Режим Окно текущих данных решает ваши и подобные проблемы.Преимущества:

  • минимизирует использование памяти и позволяет работать с большими объемами данных, аналогично однонаправленному набору данных;
  • обеспечивает двунаправленную навигацию в отличие от однонаправленного набора данных;
  • дает всегда свежие данные, уменьшая необходимость обновления набора данных;
  • не задерживает выборку всех записей набора результатов, необходимых для выполнения сортировки, местоположения записи, перехода к последней записи и т. Д.
...