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

Вниз

Цикл по всем записям 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
15-1188819885
Андрей_К
2007-09-03 15:44
2007.09.30
Монография


15-1188714738
_messageboxa
2007-09-02 10:32
2007.09.30
Разбить диск


2-1188787345
Виталий_____
2007-09-03 06:42
2007.09.30
RichEdit


15-1188909994
Denis_
2007-09-04 16:46
2007.09.30
Палец заменит кредитку?


2-1188802512
Dmitriy_
2007-09-03 10:55
2007.09.30
Как нажать на кнопку в окне браузера