Несколько наборов данных...

habibi

Как определить что процедура отработала полностью, если1) Делается на VBScript2) Рекордсет - асинхронный (Set rs = cmd.execute(, , adAsyncExecute))3) Процедура возвращает несколько наборов данных....Пасыба...
24 ответа

habibi

Да, и ещё... В моём контексте это надо сделть без использования событий 8-(( Только с помощю свойств...Интересно, такое вообще возможно ?


habibi

Может здесь посмотрите?


habibi

Вы, часом, форумом не ошиблись?


habibi

Ну вроде бы оттак...
<pre class="prettyprint linenums"> Do While cmd.State = adStateExecuting DoEvent Loop MsgBox "ФСЁ !" </pre>
Теперь др. вопрос, как (в тех же условиях) выхватить, рекордсет наполнился одним из наборов данных ?


habibi

Может <a href="http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=23884" target="_blank">здесь</a> посмотрите?
Да проблема ИМЕННО таж же самая... Только в том посте к её решению так и не пришли... Приеду полный код, что б было понятней... И повторюсь.. События использовать - нельзя...
<pre class="prettyprint linenums">CREATE proc habibi_ac_test as declare @CompanyName nvarchar(40) set @CompanyName = 'Самый Первый тест' raiserror('%s пройден.',10,1,@CompanyName)with nowait set @CompanyName = 'Первый тест' raiserror('%s пройден.',10,1,@CompanyName)with nowait set @CompanyName = 'Второй тест' WAITFOR DELAY '00:00:05' raiserror('%s пройден',10,1,@CompanyName) with nowait set @CompanyName = 'Третий тест' WAITFOR DELAY '00:00:05' raiserror('%s пройден',10,1,@CompanyName) with nowait select top 5 * from documents GO Dim cmd 'Команда Dim e Set cmd = CreateObject("ADODB.Command") Set cmd.ActiveConnection = conn cmd.CommandText = "habibi_ac_test" cmd.CommandType = 4 Set rs = cmd.execute(, , adAsyncExecute) Do While cmd.State = adStateExecuting If conn.Errors.Count > 0 Then For Each E In conn.Errors MsgBox ( E.Description ) Next Set rs = rs.NextRecordset End If DoEvent Loop MsgBox "ФСЁ !" </pre>
Он - естессно не пашет... 8-))


habibi

Вы, часом, форумом не ошиблись?
Я - тоже когда не знаю, что подсказать - всегда начинаю умничать 8-)))


habibi

Думаю, что RETURN был специально придуман для возврата кода завершения процедуры. Также как и выходные параметры


habibi

Думаю, что RETURN был специально придуман для возврата кода завершения процедуры. Также как и выходные параметры
Не совсем понял, причём здесь RETURN ???Проблема втом. что при асинхронном вызове не заходит в кусок
<pre class="prettyprint linenums">If conn.Errors.Count > 0 Then</pre>


habibi

При том что ваш вопрос звучал "Как определить что процедура отработала полностью, если"


habibi

При том что ваш вопрос звучал "Как определить что процедура отработала полностью, если"
Ясно... А что ж делать с
<pre class="prettyprint linenums">If conn.Errors.Count > 0 Then</pre>


habibi

Если я правильно понял,то вам следует написать свой обработчик события хода выполнения процедуры. Пример можно найти в мсдн,когда-то оттуда и брал. используеться специально для асинхронного режима исполнения просиды.


habibi

Если я правильно понял,то вам следует написать свой обработчик события хода выполнения процедуры. Пример можно найти в мсдн,когда-то оттуда и брал. используеться специально для асинхронного режима исполнения просиды.
Все примеры, что я нашёл на МСДН работают через события коннекшена 8-(( А мне необходимо это как - то обойти ииспользовать только свойства... Задачка чуть усложнена 8-)


habibi

Open рекордсету сделайте.


habibi

Open рекордсету сделайте.
Не совсем понял... В каком месте приведённого скрипта ??? Поясните плиз...


habibi

В первом,ваши ошибки содержатся в рекордсете,если мне не изменяет память,и пройдясь по его филдам,вы запросто должны считать их,т.е коллекция Errors ,будет пустая ,а в филдах рекодсета буду вашти значения
<pre class="prettyprint linenums"> rs.open if Not rs.Eof Then rs.moveNext msgBox rs.Field(0).value ............. set rs = rs.NextRecordset</pre>


habibi

В первом,ваши ошибки содержатся в рекордсете,если мне не изменяет память,и пройдясь по его филдам,вы запросто должны считать их,т.е коллекция Errors ,будет пустая ,а в филдах рекодсета буду вашти значения
Нет... Так не работает 8-((( да и
<pre class="prettyprint linenums">rs.open</pre>
тут не уместен если уже был
<pre class="prettyprint linenums">Set rs = cmd.execute(, , adAsyncExecute)</pre>
Ещё есть варианты ? Очень нада 8-((


habibi

В Вашем случае видимо придется извращаться так как указано в конце этой ветки.


habibi

В Вашем случае видимо придется извращаться так как указано в конце <a href="http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=54129&hl=%e0%f1%e8%ed%f5%f0%ee%ed%ed" target="_blank">этой ветки</a>.
Так по-моему не красиво (через табличку с результатами прогресса выполнения которую опрашивать по таймеру)... Кактож блин QA обрабатывает отето
<pre class="prettyprint linenums">raiserror('%s пройден.',10,1,@CompanyName)with nowait</pre>
Я - тоже так хочу 8-(( Причём он - все делает исключительно именно так как нада в моём случае...


habibi

Да, и это мне кажется или VBScript не обращает внимания на with nowait ??


habibi

Все уже обсуждено в первом указаном мною топике, на третьей странице:
magnus23, Я тоже какое-то время назад пытался получать каку-нибудь информацию от сервера при асинхронном выполнении через сообщения ADO, и тоже полный облом. Вот сейчас даже посмотрел - print ловится только InfoMessage'ем, причем только _первый_ print в процедуре (вообще ересь какая-то). Я искал способ рисовать прогресс для восстановления БД - и решилось все только использованием SQLDMO, другого варианта поймать сообщения "N percents completed", которые исправно вылазят в QA, не оказалось.Пробовал в ньюсах узнать, как это QA удается так лихо работать, говорят - через ODBC API + многопоточность. В применении к VB единственный универсальный вариант тогда - это многопоточность (в VB сделать будет тяжело, конечно, но возможно) + _синхронные_ запуски запросов. Судя по всему, так экстремально решать эту проблему вообще не принято. :)


habibi

2 Николай МВ:Т.е. ответ: Успокойся HABIBI у тя этого НИКАК не получиться это сделать не возможно без лишней таблички... Я правильно понял ?


habibi

Да, ответ такой, но это только мое мнение, необъективное. :) Наверняка существуют способы сделать это по другому.


habibi

Может у меня с процедурой что - то не правильно ???? Вот такая процедура
<pre class="prettyprint linenums">CREATE proc habibi_ac_test as raiserror('Какое-то безобразие !!!',16,1) with nowait WAITFOR DELAY '00:00:10' select top 5 * from documents GO </pre>
выподает по ошибке через 10 секунд... для чего я тогда припесал with nowait ????


habibi

На мой взгляд reaiserror предназначен только для отработки критических ситуации и сообщений о ошибке.
RAISERRORReturns a user-defined error message and sets a system flag to record that an error has occurred. Using RAISERROR, the client can either retrieve an entry from the sysmessages table or build a message dynamically with user-specified severity and state information. After the message is defined it is sent back to the client as a server error message.
Похоже в SQL Server нет удобного способа оповещать клиента о ходе работы. К сожалению...