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

habibi

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

habibi

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


habibi

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


habibi

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


habibi

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


habibi

Может здесь посмотрите?
Да проблема ИМЕННО таж же самая... Только в том посте к её решению так и не пришли... Приеду полный код, что б было понятней... И повторюсь.. События использовать - нельзя...
CREATE proc habibi_ac_test
as 

declare @CompanyName nvarchar(<b>40</b>)
set @CompanyName = 'Самый Первый тест'

raiserror('%s пройден.',<b>10</b>,<b>1</b>,@CompanyName)with nowait
set @CompanyName = 'Первый тест'
raiserror('%s пройден.',<b>10</b>,<b>1</b>,@CompanyName)with nowait

set @CompanyName = 'Второй тест'
WAITFOR DELAY '00:00:05'
raiserror('%s пройден',<b>10</b>,<b>1</b>,@CompanyName) with nowait


set @CompanyName = 'Третий тест'
WAITFOR DELAY '00:00:05'
raiserror('%s пройден',<b>10</b>,<b>1</b>,@CompanyName) with nowait

select top <b>5</b> * from documents

GO


 Dim cmd 'Команда
 Dim e
 Set cmd = CreateObject("ADODB.Command")
 Set cmd.ActiveConnection = conn
 cmd.CommandText = "habibi_ac_test"
 	cmd.CommandType = <b>4</b>
 Set rs = cmd.execute(, , adAsyncExecute)


 Do While cmd.State = adStateExecuting
 If conn.Errors.Count > <b>0</b> Then 
 For Each E In conn.Errors 
 MsgBox ( E.Description )
 Next 
 Set rs = rs.NextRecordset
 End If 
 
 DoEvent
 Loop
MsgBox "ФСЁ !"
Он - естессно не пашет... 8-))


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

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


habibi

В Вашем случае видимо придется извращаться так как указано в конце этой ветки.
Так по-моему не красиво (через табличку с результатами прогресса выполнения которую опрашивать по таймеру)... Кактож блин QA обрабатывает отето
raiserror('%s пройден.',<b>10</b>,<b>1</b>,@CompanyName)with nowait
Я - тоже так хочу 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

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