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

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

Работа с Insert Into...Values с использованием потоков [D7, MSSQL]


Страницы:   1 2

NotGooDP ©   (2006-08-01 10:59:00) 

Знающие люди, здравствуйте...
Проблема состоит в следующем:
При копировании информации (порядка 1 млн.записей), программа никак не реагирует на действия пользователя, понятно что копирование выполняется и после завершения копирования (~15-45мин ) опять отвисает, чтобы успокоить пользователя необходимо использовать ProgressBar...
т.е. Необходимо каким-то образом обновлять этот самый ProgressBar во время копирования информации.
Я предполагаю как это можно сделать (скорее всего с помощью выделения потока для копирования информации), но осуществить сей механизм у меня не получается бьюсь уже 3 день, ПОМОГИТЕ ПОЖАЛУЙСТА...


Anatoly Podgoretsky   (2006-08-02 19:56:00) [1]

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


Slym   (2006-08-02 05:34:00) [2]

Попробуй так и засеки время...
function TdmDataModule.SaveInfoLoadingMobile(aFileName: string;
    aLoad_data_all_records,
    aLoad_data_loading_records, aLoad_data_update_records,
    aLoad_data_insert_records: Integer): Boolean;
begin
Result := False;
With ADOQueryInsertMobile do begin
  Active := False;
  Parameters.FindParam('Load_data_filename').Value := aFileName;
  Parameters.FindParam('Load_data_all_records').Value := аLoad_data_all_records;
  Parameters.FindParam('Load_data_loading_records').Value := aLoad_data_loading_records;
  Parameters.FindParam('Load_data_update_records').Value := aLoad_data_update_records;
  Parameters.FindParam('Load_data_insert_records').Value := aLoad_data_insert_records;
  try
    //ExecSQL;
    Result := True;
  except
  end;
end;
end;

если убрать бадягу с Parameters.FindParam('Load_data_filename')то твой код будет быстрее на засеченное время
Params:array[0..4] of TParameter;

Params[0]:=Parameters.FindParam('Load_data_filename');
а в цикле Params[0].Value:=aFileName;
можно ADOQuery заменить на ADOCommand и поставить Prepared:=true;


NotGooDP   (2006-08-01 16:24:00) [3]

Всем спасибо, проблема разрешилась...


Neo Trinitron   (2006-08-01 15:53:00) [4]

Значение какого-то поля поделить на диапазоны, желательно и проще равные. Эти диапазоны будут определять краевые условия запросов - частей. А поток...так он и в африке поток. Класс TThread юзать нужно. А рисование прогрессбара как и других контролов нужно синхронизировать.


NotGooDP   (2006-08-01 15:31:00) [5]

2 Neo Trinitron

> Тогда можно в потоке, по частям

обьясни пожалуйста поподробнее ...
Копирование происходит из Access файла, индексированных полей нет

я уже просто запарился....

да и еще на счет анимации не сразу увидел

> прогу можно свернуть, передвинуть и пр.

видимо я сделал чтото не так, у меня прога не передвигалась и анимация переставала работать когда тыркаеш на окно программы

если не сложно можешь привести пример...


Neo Trinitron   (2006-08-01 15:08:00) [6]

NotGooDP, сочувствую... Тогда можно в потоке, по частям.


NotGooDP   (2006-08-01 15:05:00) [7]

2 Neo Trinitron ©
Анимацию делал, не устраивает заказчика )))
до быстродействия им похоже нет особого дела
его (Заказчика) интересует непосредственно ProgressBar, хотя мне и не понятно ТАКОЕ желание, но заказчик врод как всегда прав )


DmiSb   (2006-08-01 15:02:00) [8]

2 NotGooDP
А откуда беруться данные ?

Пример при загрузке из файла

 StrL:=TStringList.Create;
 StrL.LoadFromFile(...);
 
 for i:=0 to StrL.Count-1 do begin
     ......Insert;

     ......Post;

     if (i*100 div StrL.Count-1 > ProgressBar.Position) then begin
       ProgressBar.Position := i*100 div StrL.Count-1;
       Application.ProcessMessages;
     end;
   end;

 ProgressBar.Position:=0;
 StrL.Free;

Миллион записей не грузил, но сотни тысяч запросто


Neo Trinitron   (2006-08-01 14:58:00) [9]

Обычно такие задачи решаю так:

1. Запрос запускаю в потоке;
2. На время работы потока запускаю анимацию.

Пользователь видит что прога жива, статус бар пишет типа "подождите...", прогу можно свернуть, передвинуть и пр. Всегда удовлетворяло пользователей. А если хотят прогрессбар, то фраза "это уменьшит быстродействие и менее надёжно" должна помочь. ИМХО. Совет от первого лица.


NotGooDP   (2006-08-01 14:49:00) [10]

2 Stanislav ©
самое интересное что я уже включил данную опцию, все равно не помогает...программа так-же внешне находиться в повисшем состоянии

мне необходимо какимто образом копировать N записей , затем обновлять ProgressBar, затем продолжать копирование исключая уже скопированные N записей...


Stanislav   (2006-08-01 14:20:00) [11]

Если используете ADO то в ExecuteOption включите AsyncExecute


NotGooDP   (2006-08-01 12:21:00) [12]

механизм копирования предусматривает копирование сразу всей нформации
из файла в БД насколько я понимаю....-))

П.С. блин оффтопик какойта ... подскажите мне алгоритм пожалуйста и я скажу всем огромное спасибо )


Плохиш   (2006-08-01 12:10:00) [13]


> NotGooDP ©   (01.08.06 12:07) [14]
> Да нет никакого цикла,есть кнопочка загрузить

О, так и представляю пользователя нажимающего кнопочку порядка 1 млн. раз 8-O


zdm   (2006-08-01 12:07:00) [14]

почитай , запускай в отдельном потоке и контролируй


NotGooDP   (2006-08-01 12:07:00) [15]

Да нет никакого цикла,есть кнопочка загрузить ))))), при нажатии вызываеться SaveInfoLoadingMobile...
тогда другой вопрос каким образом мне отслеживать позицию на которой прекратилось копирование????

П.С. извиняйте за уже столь тупые вопросы, но у меня 3 проекта и мое основное напрвление никак не SQL )))


zdm   (2006-08-01 12:06:00) [16]

http://uchenik.vofka.ru/index.php?dpt=3&CID=3&ID=24


Плохиш   (2006-08-01 12:02:00) [17]


> NotGooDP ©   (01.08.06 11:40) [7]

А теперь ещё надо бы привести цикл в котором вызывается функция SaveInfoLoadingMobile и тогда тебе конкретно ткнут пальцем туда, куда надо вставить ProcessMessages.


Ega23   (2006-08-01 11:59:00) [18]

Оберни хранимой процедурой, в качестве параметра передавай размер порции.


NotGooDP   (2006-08-01 11:52:00) [19]

SQL запрос цифрой [8]


Sergey13   (2006-08-01 11:44:00) [20]

> [7] NotGooDP ©   (01.08.06 11:40)
А сам запрос?


Страницы:   1 2

Наверх

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