Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.05;
Скачать: CL | DM;

Вниз

Data Fetch в BDEClientDataSet из Oracle   Найти похожие ветки 

 
_MAX_   (2003-04-14 18:01) [0]

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


 
Sergey13 ©   (2003-04-15 09:51) [1]

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


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


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

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


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

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


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

http://oraclebones.narod.ru/


 
NAlexey ©   (2003-04-15 10:26) [5]

>Использую 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;



 
NAlexey ©   (2003-04-15 10:34) [6]

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


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

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


 
NAlexey ©   (2003-04-15 11:11) [8]

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


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

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


 
NAlexey ©   (2003-04-15 11:52) [10]

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

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:58) [11]

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


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

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


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

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

First;
while not EOF do
Next;

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



Страницы: 1 вся ветка

Текущий архив: 2003.05.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-12868
sancho
2003-04-16 19:13
2003.05.05
Про спам


8-12840
vvvaaa
2003-01-28 13:50
2003.05.05
Звук


9-12595
ogo
2002-11-28 10:45
2003.05.05
opengl для delphi


1-12808
Bug
2003-04-18 11:07
2003.05.05
Stay On Top


3-12637
SiJack
2003-04-15 14:27
2003.05.05
Как создать запрос SQL?