![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цикл по всем записям 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 записей вряд ли кому-то нужны...