Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
Хочу сделать экспорт данных из БД, но т.к. процесс довольно медленный - хочу засунуть это в анонимный поток.

Вопрос, я правильно понял как это делается, или можно сделать как-то лучше?

procedure TDExport.CreateExportThread(const QuerySQL: string);
var
  LConnection: TFDCustomConnection;
begin
  LConnection := DBTables.fdConnection.CloneConnection; // копия соединения
  LConnection.UpdateTransaction := nil;
  LConnection.Transaction := TFDTransaction.Create(LConnection);
  LConnection.Transaction.Connection := LConnection;
  LConnection.Transaction.Options := DBTables.fdTReadCommited.Options; // копируем параметры транзакции
  FExportThread := TThread.CreateAnonymousThread(
    procedure
    var
      LQuery: TFDQuery;
    begin
      LQuery := TFDQuery.Create(LConnection);
      try
        LQuery.Connection := LConnection;
        LQuery.SQL.Text := QuerySQL;
        LConnection.Connected := True;
        LConnection.StartTransaction;
        LQuery.Active := True;
        while not FExportThread.CheckTerminated do
        begin
          { .... }
        end;
        LConnection.Connected := False;
      finally
        LConnection.Commit;
        LConnection.Free;
      end;
    end);
  FExportThread.FreeOnTerminate := False;
  FExportThread.OnTerminate := ThreadFinished; 
  FExportThread.Start;
end;


Сообщение было отредактировано: 13 май 20, 22:17
13 май 20, 22:18    [22132459]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
rgreat
Member

Откуда:
Сообщений: 5977
Не могу понять зачем у тебя LConnection сидит за пределами треда.
13 май 20, 22:21    [22132461]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
rgreat
Не могу понять зачем у тебя LConnection сидит за пределами треда.

Чтобы анонимный метод захватил его, а не глобальный fdConnection.
13 май 20, 22:33    [22132468]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4583
alekcvp,

как правило, современные СУБД хорошо умеют делать экспорт. Delphi для этого не нужен. Если только "дёрнуть" хранимку
13 май 20, 22:44    [22132471]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
rgreat
Member

Откуда:
Сообщений: 5977
alekcvp,

Так внутри треда бы и создал.
13 май 20, 22:56    [22132478]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
Gerasimenko
alekcvp,
как правило, современные СУБД хорошо умеют делать экспорт. Delphi для этого не нужен. Если только "дёрнуть" хранимку

Мне нужно экспортнуть сложный запрос, чтобы было "как на экране", с подсветкой строк и т.п.
rgreat
alekcvp,
Так внутри треда бы и создал.

Хм, я просто думал что он тогда fdConnection захватит, до конца исполнения потока. Правда хз чем это плохо :)
Ну и если что-то пойдёт не так, то максимальное количество возможных исключений хотелось бы обработать вне потока.

Сообщение было отредактировано: 13 май 20, 23:08
13 май 20, 23:09    [22132486]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4583
[quote автор]
alekcvp
Gerasimenko
alekcvp,
как правило, современные СУБД хорошо умеют делать экспорт. Delphi для этого не нужен. Если только "дёрнуть" хранимку

Мне нужно экспортнуть сложный запрос, чтобы было "как на экране", с подсветкой строк и т.п.
...

Экспорт, расцветка и отображение как на экране... Что же вы вкладываете в понятие экспорт? И какая у Вас СУБД?
13 май 20, 23:13    [22132488]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
rgreat
Member

Откуда:
Сообщений: 5977
alekcvp
Ну и если что-то пойдёт не так, то максимальное количество возможных исключений хотелось бы обработать вне потока.
Все исключения у тебя будут в потоке и так.
Да и смысл делать 2 обработчика и в потоке и нет, если можно только один в потоке?

Сообщение было отредактировано: 13 май 20, 23:13
13 май 20, 23:14    [22132489]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
rgreat
Не могу понять зачем у тебя LConnection сидит за пределами треда.

А я не могу понять, почему Commit идёт после закрытия коннекта. =8-[ ]
13 май 20, 23:38    [22132496]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 1082
автор
Хм, я просто думал что он тогда fdConnection захватит, до конца исполнения потока. Правда хз чем это плохо :)


Охота связываться с анонимным потоком и гадать захватится / не захватится? Классический TThread чем не угодил? И там и тут масса граблей, но классика хоть нагляднее смотрится.
13 май 20, 23:43    [22132497]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
DmSer,

Однако, как это стильно, модно, молодежно!))
13 май 20, 23:50    [22132498]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
rgreat
Member

Откуда:
Сообщений: 5977
DmSer,

Я бы тогда лучше TTask предложил, если уж есть тяга к анонимным методам.
Удобней.
13 май 20, 23:50    [22132500]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
Gerasimenko
автор
пропущено...

Экспорт, расцветка и отображение как на экране... Что же вы вкладываете в понятие экспорт? И какая у Вас СУБД?

Firebird, ну это больше отчёт, чем экспорт, люди хотят работая в программе в какой-то момент получить в экселе табличку точь-в-точь как на экране, чтобы, например, по почте её кому-нибудь отправить.
автор
Все исключения у тебя будут в потоке и так.
Да и смысл делать 2 обработчика и в потоке и нет, если можно только один в потоке?

Принято, перенёс.
автор
А я не могу понять, почему Commit идёт после закрытия коннекта. =8-[ ]

Закрытие после добавил, коммит убрать забыл 😁
автор
Охота связываться с анонимным потоком и гадать захватится / не захватится? Классический TThread чем не угодил? И там и тут масса граблей, но классика хоть нагляднее смотрится.

Лень писать класс, ради одного вызова... да и вообще, зачем тогда нужны анонимные потоки?

Сообщение было отредактировано: 14 май 20, 00:11
14 май 20, 00:13    [22132510]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4583
alekcvp,

Excel умеет забирать данные из БД и это будет существенно быстрее.
Думаю, и FB тоже умеет в Excel экспортировать.
14 май 20, 00:32    [22132516]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Gerasimenko,

FB не умеет, но и не должен куда то там что-то экспортировать, ибо не серверное это дело. Но вот FR, например, имеет достаточно отлаженный набор фильтров в разного рода популярные форматы. И вот именно это, на мой взгляд, в данном случае самый цивилизованный путь.
14 май 20, 00:40    [22132520]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4583
Vlad F
Gerasimenko,

FB не умеет, но и не должен куда то там что-то экспортировать, ибо не серверное это дело. Но вот FR, например, имеет достаточно отлаженный набор фильтров в разного рода популярные форматы. И вот именно это, на мой взгляд, в данном случае самый цивилизованный путь.

глянул, для интересу... http://www.ibase.ru/impexp/
14 май 20, 00:51    [22132523]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
ъъъъъ
Member

Откуда:
Сообщений: 685
Gerasimenko
alekcvp,

Excel умеет забирать данные из БД и это будет существенно быстрее.
Думаю, и FB тоже умеет в Excel экспортировать.

Иксель импортировать данные из БД умеет только когда есть источник odbc или oledb, или из древних db-форматов.
14 май 20, 00:56    [22132525]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Gerasimenko
Vlad F
Gerasimenko,

FB не умеет, но и не должен куда то там что-то экспортировать, ибо не серверное это дело. Но вот FR, например, имеет достаточно отлаженный набор фильтров в разного рода популярные форматы. И вот именно это, на мой взгляд, в данном случае самый цивилизованный путь.

глянул, для интересу... http://www.ibase.ru/impexp/

Ещё раз, - сервер - не умеет. Инструменты некоторые, да, умеют экспортировать ИЗ него, с разной степенью успеха.
Ты уж давай, жена, отличай разврат от ситуации. (с))
14 май 20, 01:06    [22132528]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4583
Vlad F
Gerasimenko
пропущено...

глянул, для интересу... http://www.ibase.ru/impexp/

Ещё раз, - сервер - не умеет. Инструменты некоторые, да, умеют экспортировать ИЗ него, с разной степенью успеха.
Ты уж давай, жена, отличай разврат от ситуации. (с))

т.е. ты согласен, что экспортировать можно. на этом все: давай, до свидания
14 май 20, 01:08    [22132529]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7265
А зачем выборку запускать в транзакции? Ну и цикл бесконечный понравился тоже конечно)))

        while not FExportThread.CheckTerminated do
        begin
          { .... }
        end;


Сообщение было отредактировано: 14 май 20, 01:14
14 май 20, 01:15    [22132530]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
Vlad F
Member

Откуда:
Сообщений: 1281
Gerasimenko
Vlad F
пропущено...

Ещё раз, - сервер - не умеет. Инструменты некоторые, да, умеют экспортировать ИЗ него, с разной степенью успеха.
Ты уж давай, жена, отличай разврат от ситуации. (с))

т.е. ты согласен, что экспортировать можно. на этом все: давай, до свидания

Все дело в том, что я с твоим первоначальным посылом, в принципе, не согласен.
А так, экспортировать можно и нужно, надо только уметь как.
А ежели бы ты действительно хотел "до свидания", то мог бы уже и сам не продолжать упорствовать, считаю.))
14 май 20, 01:28    [22132531]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
ъъъъъ
Member

Откуда:
Сообщений: 685
Gerasimenko
Vlad F
пропущено...

Ещё раз, - сервер - не умеет. Инструменты некоторые, да, умеют экспортировать ИЗ него, с разной степенью успеха.
Ты уж давай, жена, отличай разврат от ситуации. (с))

т.е. ты согласен, что экспортировать можно. на этом все: давай, до свидания

Нельзя. В системе, кроме икселя, должны быть "драйвера"(см.выше), специфичные для данной СУБД. Иксель не умеет коннектиться к FB, и драйвера в поставку не входят.
14 май 20, 01:45    [22132535]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
Relic Hunter
А зачем выборку запускать в транзакции? Ну и цикл бесконечный понравился тоже конечно)))

А FireDAC умеет запрос без транзакции выполнять?.. Цикл - рыба.
14 май 20, 03:33    [22132544]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
Vlad F
Но вот FR, например, имеет достаточно отлаженный набор фильтров в разного рода популярные форматы. И вот именно это, на мой взгляд, в данном случае самый цивилизованный путь.

Согласен, но а) у меня слишком примитивная задача, б) нафиг надо на свои его покупать.

Сообщение было отредактировано: 14 май 20, 03:34
14 май 20, 03:35    [22132545]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1576
А написать просто отдельное приложение, запустил его и пусть работает, если это долго.
15 май 20, 04:19    [22133375]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1114
посмотри вот этот код, может быть что-то позаимствуешь

https://bitbucket.org/vaksel/progressview
15 май 20, 08:05    [22133404]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
fraks
А написать просто отдельное приложение, запустил его и пусть работает, если это долго.

Ну долго в смысле что не мгновенно, не хочется интерфейс подвешивать, а .ProcessMessages() в цикле - зло, ИМХО.
энди
посмотри вот этот код, может быть что-то позаимствуешь
https://bitbucket.org/vaksel/progressview

Я уже сделал, спасибо.
15 май 20, 15:30    [22133740]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
qwertEHOK
Member

Откуда: Волгоград
Сообщений: 273
и как оно, работает?
при длительной процедуре в базе что у вас на форме происходит? как организовано ожидание пользователя?
16 май 20, 23:23    [22134376]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт данных из БД в потоке  [new]
alekcvp
Member

Откуда:
Сообщений: 2071
qwertEHOK
и как оно, работает?
при длительной процедуре в базе что у вас на форме происходит? как организовано ожидание пользователя?

Работает. Ну "длительная" у меня - это в пределах минуты.
На форме происходит обновление TProgressBar'а. Ожидание организовано модальной формой с прогрессбаром и кнопкой "отмена".
17 май 20, 14:21    [22134538]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить