|
|
|
Загадки хранимых процедур
|
|||
|---|---|---|---|
|
#18+
Приветствую всех! такая вот интересная проблема/особенность нарисовалась... есть: MsSQL2k, ADO2.7, ASP хранимая процедура вида: CREATE PROCEDURE usp_addUser @u_login varchar(30), @u_pwd varchar(30) AS BEGIN DECLARE @res int EXEC @res= sp_addlogin @u_login, @u_pwd, 'base1' IF(@res = 1) GOTO _err0_ EXEC @res= sp_adduser @u_login, @u_login IF(@res = 1) GOTO _err1_ INSERT INTO t_user (us_login) VALUES (@u_login) IF(@@ERROR>0) GOTO _err2_ RETURN 0 _err2_: EXEC sp_dropuser @u_login _err1_: EXEC sp_droplogin @u_login _err0_: RAISERROR('error of create ''%s''', 16, 1, @u_login) RETURN 1 END пытаюсь вызвать ее из ASP: ... db= Server.CreateObject("ADODB.Connection"); cmd= Server.CreateObject("ADODB.Command"); db.open(__CONNECTSTR); with(cmd) { activeConnection= db; commandType= adCmdStoredProc; commandText= "usp_addUser"; parameters.append(createParameter("return", adInteger, adParamReturnValue, 4)); parameters.append(createParameter("u_login", adVarChar, adParamInput, 30, "bla-bla-bla")); parameters.append(createParameter("u_pwd", adVarChar, adParamInput, 30, "bla-bla-bla")); rs= execute(); } ... после этого собственно загадки и начинаются: 1. пытаюсь проверить cmd.parameters("return").value - а он undefined... 2. при возникновении ошибки _МОЙ_ RAISERROR не выставляется, а при удачном выполнении sp_addlogin и неудачном EXEC sp_adduser или INSERTе вообще не происходит exeptionов (естессно, ASP-код обрабатывается в try-блоке)... на сайтах я вычитал, что вроде бы все дело в "пакете recordsetов", пробираться по которым нужно конструкциями типа: while(rs) { if(rs.state==adStateClosed) break; rs= rs.nextRecordset; } НО!!! 1. recordset-то ко мне приходит УЖЕ ЗАКРЫТЫМ!!! 2. returnы все равно ТЕРЯЮТСЯ!!! причем, если не вызывать инсертов и хранимых процедур (внутри своей процедуры), то вся вышеозначенная гадость корректно выставляется!!! (только вот нах... нужна такая процедура...) ЛЮДИ!!! ПОМОГИТЕ!!! уже 3 дня как лбом об стену, и не могу разобраться... ПРОЕКТ ГОРИТ!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 20:15:41 |
|
||
|
Загадки хранимых процедур
|
|||
|---|---|---|---|
|
#18+
Может быть дело в том, что ADO 2.7 заточен под .NET и имеет смысл вернуться к 2.6 например. Или на ASP.NET перейти :) Я тоже сталкивался с такого рода поведением ADO. Были случаи, когда длительно выполняющиеся процедуры нормально выполнялись на сервере, но параметры вообще не возвращали, независимо от таймаутов. Может помочь такой вариант: отказаться вообще от return, а возвращать результат в output-параметре. Или set nocount on в начало процедуры поставить, тогда бегать по рекордсетам не придется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 20:28:12 |
|
||
|
Загадки хранимых процедур
|
|||
|---|---|---|---|
|
#18+
Насчет ADO не знаю, но output-параметры и set nocount on не помогают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 21:00:56 |
|
||
|
Загадки хранимых процедур
|
|||
|---|---|---|---|
|
#18+
Попробуй так. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. execute будет выбрасывать исключение при возврате не 0-го значения. значение return-параметра можно получить по нулевому индексу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 21:30:30 |
|
||
|
Загадки хранимых процедур
|
|||
|---|---|---|---|
|
#18+
ХЕХ, работает, ссука!!! СПАСИБО!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2002, 21:44:45 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1822078]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
75ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 225ms |
| total: | 412ms |

| 0 / 0 |
