Форум: "Базы";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c