Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Загадки хранимых процедур / 6 сообщений из 6, страница 1 из 1
01.07.2002, 20:15:41
    #32034599
sky
sky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
Приветствую всех!

такая вот интересная проблема/особенность нарисовалась...

есть: 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 дня как лбом об стену, и не могу разобраться...
ПРОЕКТ ГОРИТ!!!
...
Рейтинг: 0 / 0
01.07.2002, 20:28:12
    #32034601
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
Может быть дело в том, что ADO 2.7 заточен под .NET и имеет смысл вернуться к 2.6 например. Или на ASP.NET перейти :)

Я тоже сталкивался с такого рода поведением ADO. Были случаи, когда длительно выполняющиеся процедуры нормально выполнялись на сервере, но параметры вообще не возвращали, независимо от таймаутов.

Может помочь такой вариант: отказаться вообще от return, а возвращать результат в output-параметре.

Или set nocount on в начало процедуры поставить, тогда бегать по рекордсетам не придется.
...
Рейтинг: 0 / 0
01.07.2002, 21:00:56
    #32034608
sky
sky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
Насчет ADO не знаю, но output-параметры и set nocount on не помогают.
...
Рейтинг: 0 / 0
01.07.2002, 21:30:30
    #32034614
Miha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
Попробуй так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
db= Server.CreateObject( "ADODB.Connection" ); 
cmd= Server.CreateObject( "ADODB.Command" ); 
db.open(__CONNECTSTR); 
with(cmd) 
{
activeConnection= db; 
commandType= adCmdStoredProc; 
commandText=  "usp_addUser" ; 
NamedParameters = True;

parameters.append(createParameter( "", 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")); 
execute ,,adCmdStoredProc + adExecuteNoRecords; 
} 

execute будет выбрасывать исключение при возврате не 0-го значения.
значение return-параметра можно получить по нулевому индексу.
...
Рейтинг: 0 / 0
01.07.2002, 21:44:45
    #32034616
sky
sky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
ХЕХ, работает, ссука!!!

СПАСИБО!!!
...
Рейтинг: 0 / 0
01.07.2002, 21:49:51
    #32034617
sky
sky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Загадки хранимых процедур
2VVG_

твой метод я еще раз перепроверил, связка "set nocount on" + output-параметры тоже работает!

правда, не так красиво, как метод от Miha.

в любом случае, СПАСИБО!!!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Загадки хранимых процедур / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]