Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2012, 03:20   #1
Jl6owa
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию Ускорить процесс выгрузки из БД

Всем привет, выгружаю данные из БД ADO
Вот код
Код:
 
  ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT * FROM Tracks');
   ADOQuery1.SQL.Add('Order by Tracks ASC');
   ADOQuery1.Active:=True;
   ADOQuery1.First;
   while not ADOQuery1. EoF do
    begin
   htmlistbox2.Items.Add(ADOQuery1.Fields.Fields[0].AsString);
   jvlistbox2.Items.Add(ADOQuery1.Fields.Fields[1].AsString);
    ADOQuery1.Next;
 end;
На 6 тысяч записей уходит примерно 9 секунд, это слишком много. Как можно ускорить этот процесс?
Jl6owa вне форума Ответить с цитированием
Старый 24.03.2012, 05:36   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Грузить не ВСЕ записи, а только нужные. Если нужны ВСЕ записи сразу (в чём сомневаюсь) то грузить по крайней мере не все поля.
vovk вне форума Ответить с цитированием
Старый 24.03.2012, 08:04   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Items.BeginUpdate/Items.EndUpdate

Код:
  htmlistbox2.Items.BeginUpdate;
  jvlistbox2.Items.BeginUpdate;
  try
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Text:='SELECT * FROM Tracks Order by Tracks ASC';
    ADOQuery1.Active:=True;
    ADOQuery1.First;
    while not ADOQuery1. EoF do
    with ADOQuery1.Fields do
    begin
      htmlistbox2.Items.Add(Fields[0].AsString);
      jvlistbox2.Items.Add(Fields[1].AsString);
      ADOQuery1.Next;
    end;
  finally
    htmlistbox2.Items.EndUpdate;
    jvlistbox2.Items.EndUpdate;
  end;
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 24.03.2012 в 08:07.
Slym вне форума Ответить с цитированием
Старый 24.03.2012, 08:42   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Это даст 2 от силы 3 секунды выигрыша,
хотя тоже не лишние..
vovk вне форума Ответить с цитированием
Старый 24.03.2012, 15:54   #5
Jl6owa
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Спасибо за ответы.
Нужны все записи потому что у меня аудиоплеер и база данных музыки. Поэтому даже 2-3 секунды решают.

Вообще было бы идеально грузить записи по мере прокрутки в listbox , только я что-то не нашел информации по этому поводу.

Последний раз редактировалось Jl6owa; 24.03.2012 в 15:56.
Jl6owa вне форума Ответить с цитированием
Старый 24.03.2012, 16:44   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Мне кажется, что главная задержка именно из-за листбокс-ов (хотя с BeginUpdate - EndUpdate, как написали выше, может и не будет задержки, хз).

1. Создать два Stringlist-а и записывать данные не в listbox-ы, а в Stringlist-ы (которые висят в памяти и не влияют на визуализацию). Потом в конце цикла сбросить одним махом Stringlist-ы в Listbox-ы. Может я и не прав, но по идее это должно ускорить процесс.

2. А без листбоксов и цикла обойтись нельзя? Например, DBGrid.
Не помню как себя ведет стандартный TDBLookupList (кажется, он работает только с TTable), но TJvDBLookupList из набора JEDI сразу загрузит в себя нужное поле (хотя я и не люблю DB-компоненты). И циклы не нужны будут.
_SERGEYX_ вне форума Ответить с цитированием
Старый 24.03.2012, 20:18   #7
Jl6owa
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

_SERGEYX_
Первый вариант пришёл в голову буквально 10 минут назад.
Именно то что мне надо. Работает почти моментально.
А насчёт второго, так с Listbox проще.(Тоже не люблю DB компоненты)

Всем спасибо за внимание.
Jl6owa вне форума Ответить с цитированием
Старый 24.03.2012, 20:20   #8
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Сообщение от _SERGEYX_ Посмотреть сообщение
Мне кажется, что главная задержка именно из-за листбокс-ов (хотя с BeginUpdate - EndUpdate, как написали выше, может и не будет задержки, хз).
Тут Slym абсолютно прав, задержки при 6-7 тыс. записей из за добавление в листбокс практически не будет
vovk вне форума Ответить с цитированием
Старый 29.03.2012, 02:13   #9
Jl6owa
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 22
По умолчанию

Всё таки оказалось что вся проблема в Htmlistbox.
Стандартный istbox работает мгновенно, а этот тормозит.
Jl6owa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ускорить процесс поворота эллипса на Delphi ( Платная консультация ) Victor1963 Фриланс 0 22.02.2012 19:51
Ускорить процесс Victor1963 Помощь студентам 0 15.11.2011 12:06
Ускорить процесс. Victor1963 Общие вопросы Delphi 3 23.06.2011 21:51
Помогите ускорить процесс копирование столбцов с ГПР sergiksergik Microsoft Office Excel 2 21.05.2009 20:46