Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
ВнизЗависает при выполнении запроса Найти похожие ветки
← →
BAY (2002-06-07 22:41) [0]Доброго времени суток, уважаемые мастера.
Мне необходимо показать процесс выполнения SQL запроса, хотябы что-нибудь двигающееся.
← →
Prooksius (2002-06-07 23:14) [1]По-моему никак.
Но можно:
1) Оптимизировать запрос так, чтобы выполнялся быстрее
(может потребоваться оптимизация самой базы)
2) Запускать запрос в отдельной нити, а самому заниматься своими делами.
Интересная страничка про IB/FB: http://www.ibase.ru/
← →
Prooksius (2002-06-07 23:20) [2]Хотя, я тут подумал - все-таки можно. Но через одно место.
Можно оформить запрос в хранимую процедуру и выполнять ее по частям.
← →
Prooksius (2002-06-07 23:22) [3]Хотя, я тут подумал - все-таки можно. Но через одно место.
Можно оформить запрос в несколько хранимых процедур и выполнять этот хапрос "по частям". Ж)
← →
BAY (2002-06-07 23:36) [4]На счёт 1-го уже думал, ничего лучше не придумал, да и у меня работает всё нормально, у клиента комп на металолом пора сдавать.
2 такая идея была, незнаю как реализовать. Страничку уже смотрю...
← →
BAY (2002-06-07 23:38) [5]Это ж сколько хранимых процедур делать придётся? На каждое движение чтоли?
← →
kaif (2002-06-08 01:13) [6]Сделай курсор в виде часов (если это пару секунд)Screen.Cursor := crHourGlass
Или просто какую-нибудь анимацию запусти. Тоже нормально.
Хотя круче всего попытаться научиться в отдельном Thread что-нибудь соорудить. Хотя у меня пока никак с этим делом не получается... Наверно, надо сначала на кошках потренироваться...
← →
Prooksius (2002-06-08 10:32) [7]2 Bay: Когда ты посылаешь запрос на IB server, он сначала делает Prepare (на это уходит некоторое время, зависит от оптимизации запроса), а уж потом клиент делает Fetch результата. Во время Prepare никакого конечно прогресса показать нельзя.
Во время Fetch можно.
Есть такие компоненты "FIB+" На мой взгляд - лучшие для работы с IB (выложены на той страничке, я указывал выше). Есть стандартные в Delphi, IBExpress, кажется. Так вот, если ты ими пользуешься, там есть событие у DataSet-a, OnFetchRecord, которое позволяет запускать какие-то свои действия после приема каждой строки запроса с сервера.
У тебя в запросе наверняка есть "основная" таблица, как бы его каркас, по которой ты проходишь от начала и до конца.
Так вот пишешь StoredProc, в которой делаешь:
1) сначала считаешь количество записей в этой таблице (RecCount)
2) For select из этой таблицы и внутри begin - end пишешь подзапрос, какой надо.
3) Далее там же проверяешь, какая строчка таблицы обрабатывается. Если прошли 1/10 таблицы, делаешь suspend определенной строчки (с пустыми полями, например),
4) В клиенте по OnFetchRecord проверяешь это дело и инкрементишь ProgressBar.
Еще надо учесть, что есть разные DB-компоненты работы с IB, (одни сразу делают FetchAll, а другие - делают Fetch по мере запроса пользователя, например, скроллинг DBGrid-a). Тебе бы надо делать FetchAll, но это может быть долго.
Это все также работает, только если у тебя пропускная способность сети (если она есть) мала или записи большие по обьему, и все время уходит на Fetch. Если prepare дольше, то IMHO никак...
И еще, в событии OnFetchRecord не делай сложных и больших по времени расчетов/действий, а глядишь, конца-то и не дождешься... :)
Вообщем, поиграй, посмотри, может, чего-то и получится на таком железе...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c