Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Data Fetch в BDEClientDataSet из Oracle [D6]


_MAX_ ©   (2003-04-14 18:01:00) 

Делаю BDEClientDataSet1.Last; (тоже Query) на 30000-40000 записей из Oracle и он продолжается около 30-35 сек., в то время как SQL Navigator (Oracl"овская утилита) делает тоже за 10-12 сек. Я уже все перепробывал: и BDEClientDataSet1.PacketRecords конфигурировал, и FetchOnDemand переписывал сам- не помогает! Как добиться похожих результатов?
P.S. Когда делаю BDEClientDataSet1.Last; приложение естественно "зависает"! Использую Application.ProcessMessages, но наверное не в том событии AfterGetRecords (AfterScroll тоже пробывал) Куда его вкинуть?


NAlexey   (2003-04-15 13:45:00) [1]

Послушай _MAX_ дело в том что видимо я тебя ввел в заблуждение, этот способ подходит если ты именно скролишь набор данных, например :

First;
while not EOF do
Next;

Если ты делаешь Last, скролл возникает один раз, в конце при переходе на последнюю(Last) строку, и это событие срабатывает 1раз что для тебя неподходяще.


_MAX_   (2003-04-15 12:41:00) [2]

Не пашет! :( Наверное я что-то не то делаю!? Если я правильно понял procedure YourNameForThis(DataSet: TDataSet); -это описывается свой AfterScroll и потом он присваивается Query1.AfterScroll в процедуре procedure AnyName; А куда тогда вкидывать procedure AnyName??? И какой должна быть процедура procedure YourNameForThis(DataSet: TDataSet); что бы её можно было бы присвоить Query1.AfterScroll (procedure of object что ли)???


_MAX_   (2003-04-15 11:58:00) [3]

Понял, ща попробуем!


NAlexey   (2003-04-15 11:52:00) [4]

Нет, не получается. получается так:

procedure YourNameForThis(DataSet: TDataSet);
begin
with ProgressBar do
Position := Position + 1;
Application.ProcessMessages;
end;

procedure AnyName;
begin
ProgressBar.Max := Count;
DBGrid1.DataSource.DataSet.AfterScroll := YourNameForThis;
//Собственно если у тебя данные будут отображаться то есть
//DataSource если нет то Query1.DataSet.AfterScroll, хтя это не принципиально
//DBGrid1.DataSource.DataSet = Query1;
(* То что приводит к скроллу *)
DBGrid1.DataSource.DataSet.AfterScroll := nil;
ProgressBar.Position := 0;
end;


_MAX_   (2003-04-15 11:42:00) [5]

По логике вещей у меня получается, что к DBGrid"у, в котором я отображаю при Fetch"e записи, у меня подключен Query1 (из примера DBGrid1.DataSource.DataSet) и AfterScroll я делаю для Query1, т.к. он содержит нужные записи из базы! Получается Query1.AfterScroll=Query1AfterScroll; :)


NAlexey   (2003-04-15 11:11:00) [6]

>DataSet- это какой DataSet???
Ну можно такой DataSet - DBGrid1.DataSource.DataSet.
>Если DataSet=MyTable, то не будет ли рекурсии?
Назвав MyTableAfterScroll я не вкладывал в это никакого смысла. Это просто название(если я правильно понял вопрос).


_MAX_   (2003-04-15 11:00:00) [7]

Спасибо! Только вот вопрос: DataSet.AfterScroll :=MyTableAfterScroll; DataSet- это какой DataSet??? Если DataSet=MyTable, то не будет ли рекурсии?


NAlexey   (2003-04-15 10:34:00) [8]

Да и еще, 30000-40000 записей это всётаки много, DBGrid наверное отожрет метров 30-40 под такой набор записей. Да и притормаживать будет при прокрутке неслабо. Такчто лучше ограничивать набор записей ну хотябы спрашивать типа количество найденных записей превышает столько-то, желаете продолжить?


NAlexey   (2003-04-15 10:26:00) [9]

>Использую Application.ProcessMessages
Скорее всего правильно используешь.
>AfterScroll тоже пробывал.
Смотря как пробывал.
Если к примеру вот так, то может заработает?


procedure MyTableAfterScroll(DataSet: TDataSet);
begin
with ProgressBar do
Position := Position + 1;
Application.ProcessMessages;
end;

procedure LoadAllRecord;
begin
ProgressBar.Max := Count;
DataSet.AfterScroll := MyTableAfterScroll;
(* То что приводит к скроллу *)
DataSet.AfterScroll := nil;
ProgressBar.Position := 0;
end;


Sergey13   (2003-04-15 10:12:00) [10]

http://oraclebones.narod.ru/


_MAX_   (2003-04-15 10:02:00) [11]

Может подскажите где эти компоненты взять?


Соловьев   (2003-04-15 09:56:00) [12]


> SQL Navigator (Oracl"овская утилита) делает тоже за 10-12
> сек

ну наверное это утилитка работает не через BDE? а использует свои функции. Используй компоненты, которые напрямую работают с Oracle.


Sergey13   (2003-04-15 09:51:00) [13]

2_MAX_ (14.04.03 18:01)
>на 30000-40000 записей из Oracle и он продолжается около 30-35 сек
Рискну предположить, что при запросе 300000-400000 время увеличится до 300-350 секунд 8-)
>Я уже все перепробывал
А не пробовал пересмотреть подход к клиент-серверным приложениям? Зачем тебе на клиенте 30000-40000 записей? Их только по сети прокачать сколько времени надо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо