Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-12972
}{enon
2003-03-05 16:23
2003.05.05
Странный глюк


3-12651
RDA
2003-04-16 08:51
2003.05.05
Столбцы-массивы в Interbase


3-12605
Саня
2003-04-12 08:40
2003.05.05
Дайте рекомендацию по работе ACCESS2000 в сети


1-12775
Lighnam
2003-04-21 10:27
2003.05.05
несколько расширений в 1 строке фильтра в open dialog


4-12979
xZero
2003-03-05 14:41
2003.05.05
Вопрос о форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский