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

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

Отображение прогресса при UPDATE базы [D6]


Страницы:   1 2

leonidus ©   (2008-05-30 16:33:00) 

Юзаю Access-базу через ADO. Делаю UPDATE большой базы, и на некоторых слабеньких машинах он длится по 10-15 секунд в течении которого программа подвисает и юзер нервничает не понимая что происходит. Подскажите пожалуйста как в ходе обновления показывать прогресс работы или хотябы периодически иметь возможность вызвать application.ProcessMessages?


stas   (2008-05-31 20:56:00) [21]

leonidus   (31.05.08 18:50) [14]
Я писал про Update, а ві делаете Select.


leonidus   (2008-05-31 18:50:00) [22]

Анатолий, простите не понял вас... если вы о явном присвоении:
AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];

то я пробовал и в обжект инспекторе выставлять eoAsyncExecute, все равно подвисает программа...


Anatoly Podgoretsky   (2008-05-31 18:10:00) [23]

> leonidus  (31.05.2008 15:29:12)  [12]

Разве это команда, что бы ее
исполнять?


leonidus   (2008-05-31 15:29:00) [24]

>Stas, если делаю так:

 AdoDataSet1.ExecuteOptions:=[eoAsyncExecute];
 ADODataSet1.Close;
 ADODataSet1.CommandText:='SELECT * FROM tab ORDER BY tab.header';
 ADODataSet1.Open;

то при выполнении этого блока программа подвисает


sniknik   (2008-05-31 10:41:00) [25]

> Может. Но я всё равно сомневаюсь, что
>> длится по 10-15 секунд
> именно из-за чего-то приведённого в [5].
ну да, даже 7 запросов на 1000 записей не тянут на 15 сек...  но это не повод чтобы писать 7 вместо одного.
и да скорее всего чтото там еще есть, только раз оно не показано значит необсуждаемо. потом, если всплывет, можно будет еще про индексы поговорить, про нормализацию (условие у него смотрю по строке, т.е. там куча повторяющихся значений строк, нормализация прямотаки напрашивается). и о нужности  этих запросов вообще... (значения присваиваются странные, 0, ''... это начальная инициализация записи?... про дефаултные значения для полей автор похоже не знает... но опять таки что делается, и зачем не сказано, есть только вопрос о оптимизации запросов)

> Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.
ага, а если к машине привязать собаку, и ехать соответственно так чтобы она успевала, или мерить скорость на участках с пробками... то можно говорить что машины ужасно медленные, практически на лошади обогнать можно... и нафига они тогда нужны?


Германн   (2008-05-31 02:04:00) [26]


> sniknik ©   (30.05.08 19:53) [4]
>
> > и на некоторых слабеньких машинах он длится по 10-15 секунд
> машина - 286й пень?
> не могу другую представить, чтобы один UPDATE на ограниченной
> по размеру базе делался аж целых 15 секунд...
>

Могу себе представить, если объём оперативки не соответствует требованиям ОС. Плюс загружено много процессов.


Германн   (2008-05-31 02:01:00) [27]


> > может она больше всего времени занимает?
> проверь. выполни без него...
>

Может. Но я всё равно сомневаюсь, что
> длится по 10-15 секунд

именно из-за чего-то приведённого в [5].


sniknik   (2008-05-30 23:33:00) [28]

> может можно как-то оптимизировать запросы?
конечно... ведь это на самом деле один запрос разбитый зачемто на 7.

и еще немного времени можно выиграть используя ADOCommand вместо ADOQuery, совсем чуть чуть, но... Close в нем нет, и это хорошо, видя как ты его используеш.

> может она больше всего времени занимает?
проверь. выполни без него...


Правильный_Вася   (2008-05-30 22:55:00) [29]


> ADOQuery1.ExecSQL;   ADOQuery1.Close;

в чем сакральный смысл выделенного?

> может она больше всего времени занимает?

вероятно, если каждый из апдейтов изменяет только одну запись (что вряд ли, судя по условию <>


leonidus   (2008-05-30 22:52:00) [30]

хотя потом делаю еще и выборку:

 ADODataSet1.Close;
 ADODataSet1.CommandText:='SELECT * FROM tab ORDER BY tab.header';
 ADODataSet1.Open;

может она больше всего времени занимает?


leonidus   (2008-05-30 22:13:00) [31]

UPDATE не один, у меня их 7, база - 1000 записей:

 ADOQuery1.Close;
 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.status=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:='';
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.active_word=:Str3'+ ' WHERE tab.header<>:Str4');
 flag:=false;
 ADOQuery1.Parameters.ParamByName('Str3').Value:=flag;
 ADOQuery1.Parameters.ParamByName('Str4').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.associaciya_true=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.vibor_perevoda_true=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.mozaika_true=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.vspomnit_true=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

 ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('UPDATE tab SET tab.perevod_true=:Str1'+ ' WHERE tab.header<>:Str2');
 ADOQuery1.Parameters.ParamByName('Str1').Value:=0;
 ADOQuery1.Parameters.ParamByName('Str2').Value:='';
 ADOQuery1.ExecSQL;
 ADOQuery1.Close;

может можно как-то оптимизировать запросы?


sniknik   (2008-05-30 19:53:00) [32]

> и на некоторых слабеньких машинах он длится по 10-15 секунд
машина - 286й пень?
не могу другую представить, чтобы один UPDATE на ограниченной по размеру базе делался аж целых 15 секунд...


Stas   (2008-05-30 16:43:00) [33]

AdoDataSet.ExecuteOptions:=[eoAsyncExecute]


leonidus   (2008-05-30 16:40:00) [34]

Stas, встречный вопрос, а как выполнить запрос асинхронно?


Stas   (2008-05-30 16:39:00) [35]

Асинхронное выполнение запроса, выполнит его в отдельном потоке, программа подвисать небудет, а прогресс отобразить неполучится.


Страницы:   1 2

Наверх

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