Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизВыполнение ХП асинхронно (ADO и MSSQL) Найти похожие ветки
← →
DeadMeat © (2007-07-07 12:44) [0]Здравсте всем.
Вообщем вот какая закавыка. По условию задачи, надо выполнить запрос на выборку из таблицы с отображением текущего состояния выборки. Выборка простая и быстрая, но данных много. Сделал асинхронно (ExecuteOptions = [eoAsyncExecute, eoAsyncFetchNonBlocking]). Все пучком. Идет процесс отображения получения данных прогрессбаром. В начале я используя условия этой выборки получил COUNT(*) и применил результат в качестве количества записей, которые надо получить. Для прогрессбара ведь нужно установить максимум, а в OnFetchProgress значение переменной MaxProgress не дает реального количества. Затем в тамже (в OnFetchProgress) сделал отображение текущего состояния прогрессбара, используя Progress. И в конце "по приходу" OnFetchComplete отображаю все записи. Все работает. Нареканий нет.
Теперь следующая проблема. Надо сделать примерно тоже самое, но ни простой выборкой, а вызвать хранимую процедуру. Вот тут и обломс. Использовал в начале ADOCommand, но у него нет таких обработчиков. Потом взял ADOStoredProc. Тут ситуация какая. Я заранее не могу выяснить количество записей, которые вернет процедура. Поэтому мне прогрессбар отображать не надо, а просто сделать так, чтобы приложение не висело зависшим, пока работает ХП. Вот и начались проблемы. Используя таскменеджер я вижу, что процедура уже отработала на серваке, но вот OnFetchComplete почему-то "не приходит". Количество данных, которые возвращает процедура не так уж велико. Около 1000 записей, а то и меньше. А программа так и висит, ожидая "конца".
В чем может быть проблема?
ЗЫ. На всякий случай, может это нужная информация - процедура возвращает несколько рекордсетов.
← →
DeadMeat © (2007-07-07 12:57) [1]Проверил тоже самое с ADODataSet. Результат тотже. Не приходит OnFetchComplete.
← →
sniknik © (2007-07-07 13:31) [2]> с ADODataSet. Результат тотже. Не приходит OnFetchComplete.
у меня приходит... взял для примера процедуру sp_help, она возвращает 2 связанных рекордсета.
> В чем может быть проблема?
может быть в процедуре, всякие там set nocount on пропущены, или д.р. неправильно делаешь в общем. проверь на стандартной.
← →
DeadMeat © (2007-07-07 14:50) [3]Не спорю, что гдето ошибка.
В ХП стоит NOCOUNT (у всех моих ХП оно стоит). Заменил ее содержимое на пустышку, которая просто возвращает результат. Т.е. выход происходит сразу.
Результат тотже. И со стандартными пробовал. Не помогает. Наверняка чтото не так делаю. Но что?
← →
DeadMeat © (2007-07-07 14:59) [4]Немного дополню.
Открываю чистый проект.
Кладу на форму ADOConnection, ADOStoredProc.
Настраиваю соединения.
Ставлю в обработчике OnFetchComplete у ADOStoredProc простой ShowMessage("OK")
ExecuteOptions = [eoAsyncExecute, eoAsyncFetchNonBlocking]
ProcedureName ставлю в свою или даже sp_help.
Prepared := true
ExecProc
Никаких сообщений нету.
← →
sniknik © (2007-07-07 16:09) [5]> Немного дополню.
ну тогда и я тоже
делаю то же самое за исключением
вместо ADOStoredProc ADODataSet,
вместо "простого" ShowMessage("OK") Label1.Caption:= "Ok";
Prepared := true не делаю
Open;
сообщение есть.
← →
DeadMeat © (2007-07-07 16:42) [6]А теперь дополним друг-друга ))
Заменил ExecProc на простой Open - заработало.
Но потом я вообще избавился от ХП и переделал логику чуток, т.к. скорость работы не устроила.
Спасибо за помощь...
← →
sniknik © (2007-07-07 17:01) [7]> Заменил ExecProc на простой Open - заработало.
у правильных датасетов ExecProc нету.
+ сообщение [1], получается врал? если пробовал то где у него нашел ExecProc?
← →
DeadMeat © (2007-07-07 17:56) [8]Поясняю:
Я юзал не датасеты, а TADOStoredProc
Датасет я юзал один раз для проверки. Вполне возможно, что гдето я чегото не так сделал, когда ставил датасет. Большую часть времени я делал с ADOStoredProc
Так что не врал.. И у него и был ExecProc.
← →
Anatoly Podgoretsky © (2007-07-07 18:31) [9]Нет у ADOStoredProc метода ExecProc
← →
Shamansky_ne (2007-07-07 21:47) [10]
> Anatoly Podgoretsky © (07.07.07 18:31) [9]
> Нет у ADOStoredProc метода ExecProc
это содержимое модуля ADODB
procedure TADOStoredProc.ExecProc;
begin
InitializeMasterFields(Self);
Command.Execute;
end;
Я так понимаю разница между ExecProc и Open в том, что первый используют для изменений данных (удаление, обновление, вставка), а второй для простой выборки, скорее всего поэтому и отработал метод Open
← →
MsGuns © (2007-07-07 22:18) [11]Sniknik всегда советует выбросить из коллекции компонент "вредные". Например, TADOTable и TADOStoredProc.
И очень скоро тучи в мозгах начинают рассеиваться
← →
Anatoly Podgoretsky © (2007-07-07 22:24) [12]> Shamansky_ne (07.07.2007 21:47:10) [10]
В справке она не документирована, возможно ошибка.
← →
Anatoly Podgoretsky © (2007-07-07 22:25) [13]> MsGuns (07.07.2007 22:18:11) [11]
TAdoQuery забыл, вот тогда коллекция будет полной.
← →
DeadMeat © (2007-07-07 22:58) [14]> В справке она не документирована, возможно ошибка.
ms-help://borland.bds4/bds4win32api_win32/html/DelphiWin32_ADODBTADOStoredProcExecProcMethod.htm
Это ссылка из моей справки от Turbo Delphi Explorer 2006.
Все там документировано. Но походу и правда, надо все привести в TADODataSet.
← →
Anatoly Podgoretsky © (2007-07-07 23:20) [15]Я что-то не вижу выше указания версии Дельфи.
Ты хочешь задним числом это сделать?
← →
sniknik © (2007-07-07 23:44) [16]> Я юзал не датасеты, а TADOStoredProc
пост [1]
> Проверил тоже самое с ADODataSet. Результат тотже. Не приходит OnFetchComplete.
русским по белому написано.
т.е. если бы действительно проверял, в ADODataSet тоже самое, то и вопроса бы не было, ясно почему.
т.е. врал. не проверял.
← →
DeadMeat © (2007-07-08 11:25) [17]Да ёлы палы... Я же ясно описал чуть выше:
Датасет я юзал один раз для проверки. Вполне возможно, что гдето я чегото не так сделал, когда ставил датасет.
← →
DeadMeat © (2007-07-08 11:47) [18]> [15] Anatoly Podgoretsky © (07.07.07 23:20)
> Я что-то не вижу выше указания версии Дельфи.
> Ты хочешь задним числом это сделать?
Согласен. Моя ошибка. Но и также смело утверждать, что у этого компонента нету этого метода, тоже, мягко говоря, не правильно. Ведь и Вы не указали, в какой же версии его нету. Поэтому тут мы оба не правы и оба исправились.
← →
Anatoly Podgoretsky © (2007-07-08 11:57) [19]> DeadMeat (08.07.2007 11:47:18) [18]
Мне то зачем указывать все версии Дельфи где это не документировано, если автор ведет себя как ламер?
← →
DeadMeat © (2007-07-08 12:11) [20]Уважаемые.. Я прекрасно в курсе вашей репутации и уровня Ваших знаний. Не нужно передо мной оправдываться и подчеркивать его. Я знаю, что мне до Вас всех далеко. Простите меня грешного, что я так нагло Вас тут всех обманул.
Еще раз спасибо за помощь.
Может быть когда-нибудь я выросту из стадии ламера и стану как Вы, дядя Толя.
← →
Anatoly Podgoretsky © (2007-07-08 12:12) [21]> DeadMeat (08.07.2007 12:11:20) [20]
Зря ты про оправдания, лучше веди дисскуссию правильнее, что бы телепаты в стороне отдыхали.
← →
DeadMeat © (2007-07-08 12:30) [22]Согласен. Но ведь я же извинился за свою ошибку. Просто дело в том, что я пишу из клиента, а здесь нет этой фишки, для указания СУБД, ОС и версии IDE. Поэтому и написал в тексте первого поста от руки, а про версию делфи забыл, т.к. не подумал, что могут быть такие вот различия. Кстати в справке написано, что мол если вам не нужен результат выполнения ХП, то юзайте Open. А мне нужен был. Но потом я просто перенес его в выходную переменную и взял Open. Но поняв, что скорость меня не устроила, я заменил все на ADOCommand и перенес весь текст процедуры, сделав немного оптимизации, в него. Получилось быстрее, за счет той самой оптимизации. Да и асинхронность заработала, правда чуток по другому. Потом вспомнил про динамические запросы, но переделывать уже было лень. Хотя может потом переделаю.
Поверьте, что прося тут помощи, мне нет резона вас обманывать. Раз я сказал, что все таки юзал датасет, значит так и было. Я ведь не исключил возможности, что именно в это время я чтото сделал не так, т.к. мне пришлось много вариантов перебрать разных, ищя проблему и вполне вероятно, что гдето чтото забыл или не сделал. Я не лезу в форум при первом возникновении ошибки. Я облазию проблему вдоль и поперек, прошустрю форумы и поисковики и лишь на третий или четвертый день, если ничего не выходит, спрошу здесь.
Конечно, переубедить Вас в том, что я Вас обманул мне не представляется возможным, посему делать этого я не буду, ибо зря.
Проблема решена, урок усвоен. Спасибо за внимание.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.055 c