Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Вниз

Цикл по всем записям ADODataSet   Найти похожие ветки 

 
Amid   (2007-04-20 12:21) [0]

Добрый день уважаемые программисты!
Помогите кто может...  очень нужно :)

Есть ADODataSet с ~3000 записей, по нему цикл:

for i:=1 to ADODataSet.RecordCount do begin
 {бизнес логика}
 ADODataSet.Next;
end;

Не устраивает скорость работы (проблема в 3000 .Next"ов)

Вопрос следующий: есть ли возможность доступа к записи напрямую (вроде ADODataSet.Record[i]), чтобы не использовать метод .Next? Данные read-only.

BDS2006, MS SQL 2000


 
clickmaker ©   (2007-04-20 12:26) [1]


> Amid   (20.04.07 12:21)

for i:=1 to ADODataSet.RecordCount do begin => while not ADODataSet.Eof do begin

и что за {бизнес логика}? Может её проще выполнять на сервере, а на клиент отдавать результат?
А если это отображение, то сразу 3000 записей вряд ли кому-то нужны...


 
Reindeer Moss Eater ©   (2007-04-20 12:29) [2]

Не устраивает скорость работы (проблема в 3000 .Next"ов)

А откуда вообще уверенность, что вся проблема в 3000 next"ах ?


 
Reindeer Moss Eater ©   (2007-04-20 12:32) [3]

Убери бизнес логику и замеряй время цикла.
Убери из цикла некст и используй цикл for без перемешения по записям (бизнес логика на первой записи)
Сравни время.


 
Amid   (2007-04-20 12:37) [4]


> Убери бизнес логику и замеряй время цикла.

так и сделал
время уходит именно на перемещение по базе

> и что за {бизнес логика}? Может её проще выполнять на сервере,
>  а на клиент отдавать результат?

на сервере не получится
да и выполняется она быстро


 
Reindeer Moss Eater ©   (2007-04-20 12:43) [5]

Еще вот эту несуразность убери

for i:=1 to ADODataSet.RecordCount do begin


 
Amid   (2007-04-20 12:53) [6]


> Еще вот эту несуразность убери
> for i:=1 to ADODataSet.RecordCount
> do begin

имеешь в виду сделать
while not ADODataSet.EoF do ADODataSet.Next?
в моем случае это один и тот же цикл

Господа, неужели нельзя получить доступ скажем к 555й записи не переходя на нее?
Данные все на клиенте же :(


 
Reindeer Moss Eater ©   (2007-04-20 12:55) [7]

на сервере не получится
"Это другие не входят, а мой - входит!"


 
Reindeer Moss Eater ©   (2007-04-20 12:59) [8]

в моем случае это один и тот же цикл

Но не один и тот же выполняемый код.
Впрчем ты же умный. Чего тогда с проблемами своими пришел?

Говорят же - делай на сервере.


 
Reindeer Moss Eater ©   (2007-04-20 13:03) [9]

Господа, неужели нельзя получить доступ скажем к 555й записи не переходя на нее?
Данные все на клиенте же :(


Получи свои данные в xml и получишь доступ к строкам как к массиву.
Только сдается мне что все будет то же самое.


 
Desdechado ©   (2007-04-20 13:08) [10]

> время уходит именно на перемещение по базе
Это всего лишь, имхо, смещение указателя.

Проверь наличие связанных с этим датасетов, обработчики события Before/After Scroll и т.п.
Отключи привязку с визуальным контролам (Dataset.DisableControls)


 
White Barsik   (2007-04-20 13:56) [11]


> Господа, неужели нельзя получить доступ скажем к 555й записи
> не переходя на нее?
> Данные все на клиенте же :(

Тогда может быть проще выбрать данны по какому либо условию? Если запись с ID = 555 то почему в выборке этого не сделать?
И вообще любое условие определяющее выборку данных можно передать на сервер, который и ограничит число записей.


 
MsGuns ©   (2007-04-20 14:00) [12]

DisableControls не блокирует события датасета
Поэтому в обработчиках надо пользоваться флажком
Например:

procedure TDataModule1.ADODataSetAfterScrool(DataSet...)
begin
 if DataSet.Tag>0 then exit;
 <функционал>
end;

procedure Tform1.MyScanProc;
var
 bm: TBookMark;
begin
 with ADODataSet1 do
  begin
    bm := GetBookMark;
    Tag := 1;
    DisableControls;
    First;
    While not Eof do
      begin
        ...
        Next;
      end;
    GoToBookMark(bm);
    FreeBookMark(bm);
    Tag := 0;
    EnableControls;
  end;
end;

Такой код даже на 10000 записей работает секунду-две (на системе с 256 метрами и Celeron 2000)


 
Desdechado ©   (2007-04-20 14:10) [13]

MsGuns ©   (20.04.07 14:00) [12]
А я и не говорил, что блокирует. Это было указано, как дополнительная опция, способствующая ускорению пробежки по датасету, вкупе с анализом наличия обработчиков событий.


 
MsGuns ©   (2007-04-20 14:12) [14]

[12] писАлось как ДОПОЛНЕНИЕ к [10], но не как опровержение


 
sniknik ©   (2007-04-20 14:37) [15]

> DisableControls не блокирует события датасета
> Поэтому в обработчиках надо пользоваться флажком
> Например:

ControlsDisabled


 
w2000   (2007-05-26 15:48) [16]


> Вопрос следующий: есть ли возможность доступа к записи напрямую
> (вроде ADODataSet.Record[i]), чтобы не использовать метод
> .Next? Данные read-only.


DBEdit1.Text:=ADODataSet1.Fields[0].DisplayText


 
MsGuns ©   (2007-05-26 16:27) [17]

>w2000   (26.05.07 15:48) [16]

И к чему это ?


 
Виталий Панасенко(дом)   (2007-05-27 00:21) [18]


> Amid   (20.04.07 12:53) [6]
>
>
> > Еще вот эту несуразность убери
> > for i:=1 to ADODataSet.RecordCount
> > do begin
>
> имеешь в виду сделать
> while not ADODataSet.EoF do ADODataSet.Next?
> в моем случае это один и тот же цикл
>
> Господа, неужели нельзя получить доступ скажем к 555й записи
> не переходя на нее?
> Данные все на клиенте же :(
>

Данные извлекаются(фетчатся) по мере надобности. ADODataSet.First; AdoDataSet.MoveBy(554);
Но все равное - это ПЕРЕХОД к 555-й записи...Интерено, как можно что-то достать, не достав этого..?!!!



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

Форум: "Базы";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
3-1179972979
Dilmo
2007-05-24 06:16
2007.09.30
Тормозит соединение с базой данных


15-1188886052
boriskb
2007-09-04 10:07
2007.09.30
Сумашедший мир


15-1188983980
tytus
2007-09-05 13:19
2007.09.30
Нужен сниффер и все что с ним связано.


2-1188503226
Dmitry_177
2007-08-30 23:47
2007.09.30
MS SQL SERVER не знаю с чего начать..


15-1188750357
ArtemESC
2007-09-02 20:25
2007.09.30
А с вами бывает такое?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский