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 день, ПОМОГИТЕ ПОЖАЛУЙСТА...


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

SQL запрос


INSERT INTO [dbo].[Load_data]
([Load_data_filename],
[Load_data_all_records], [Load_data_loading_records],
[Load_data_update_records], [Load_data_insert_records])
VALUES(:Load_data_filename,
:Load_data_all_records,
:Load_data_loading_records,
:Load_data_update_records,
:Load_data_insert_records)


NotGooDP   (2006-08-01 11:40:00) [22]


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;


Да и еще сразу скажу, программу разрабатывал не я, человек, который ее создавал и поддерживал уволился, мне поступило требованние сделать ProgressBar чтобы было видно процесс загрузки


Sergey13   (2006-08-01 11:34:00) [23]

2 [4] NotGooDP ©   (01.08.06 11:29)
>т.к. после ExecSQL начинается выполнение
Если иллюстрировать свои слова кодом, то меньше будет гаданий и больше конструктива.


Ega23   (2006-08-01 11:29:00) [24]

Как вариант - делать это в цикле порциями Insert into Select top 1000 from ...
После каждой порции - отписывать результат во временную таблицу. А другим потоком - читать этот результат. Только таблица должна быть вида ##temp.


NotGooDP   (2006-08-01 11:29:00) [25]

Спасибо, за внимание, проявленное к моему вопросу, НО
возникает встречный вопрос...
Каким образом отслеживать эти N записей....
это как раз и есть основной вопрос наверное...
т.к. после ExecSQL начинается выполнение копирования и все...программа отвисает только после завершения процесса копирования

доп.инф. С БД соединяюсь с помощью ADO


Сергей М.   (2006-08-01 11:16:00) [26]


> Необходимо каким-то образом обновлять этот самый ProgressBar


Через каждые N скопированных записей вычисляй и устанавливай очередное значение св-ва ProgressBar.Position, после чего вызывай ProgressBar.Update.
Пользовательский ввод при этом будет по-прежнему "заморожен" (что не позволит ему прервать операцию, если это нежелательно), но прогресс операции будет виден юзеру.


ANB   (2006-08-01 11:04:00) [27]

Поставь каждые 1000-10000 записей (экспериментально подбери)

ProgressBar.StepIt;
Application.ProcessMessages;

И будет тебе счастье. А с отдельным потоком огребешь дополнительные проблемы (они решаются, но сильно прямыми руками :) ).
Заодно сможешь и кнопку "Стоп" прикрутить.


Johnmen   (2006-08-01 11:03:00) [28]

Если это выполняется одной командой типа INSERT INTO ... SELECT FROM ..., то получить достоверные данные о процессе выполнения представляется затруднительным.
Если же последовательностью команд типа INSERT INTO ..., то достаточно вставить ProcessMessage после обновления ProgressBar. Доп.поток не нужен.


Страницы:   1 2

Наверх

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