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