Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Цикл по всем записям ADODataSet


Amid ©   (2007-04-20 12:21:00) 

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

Есть 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


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


> 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-й записи...Интерено, как можно что-то достать, не достав этого..?!!!


MsGuns   (2007-05-26 16:27:00) [2]

>w2000   (26.05.07 15:48) [16]

И к чему это ?


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


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


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


sniknik   (2007-04-20 14:37:00) [4]

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

ControlsDisabled


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

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


Desdechado   (2007-04-20 14:10:00) [6]

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


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

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)


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


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

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


Desdechado   (2007-04-20 13:08:00) [9]

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

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


Reindeer Moss Eater   (2007-04-20 13:03:00) [10]

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


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


Reindeer Moss Eater   (2007-04-20 12:59:00) [11]

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

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

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


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

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


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


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

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

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


Reindeer Moss Eater   (2007-04-20 12:43:00) [14]

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

for i:=1 to ADODataSet.RecordCount do begin


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


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

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

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

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


Reindeer Moss Eater   (2007-04-20 12:32:00) [16]

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


Reindeer Moss Eater   (2007-04-20 12:29:00) [17]

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

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


clickmaker   (2007-04-20 12:26:00) [18]


> Amid   (20.04.07 12:21)

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо