Форум: "Базы";
Текущий архив: 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