ADOStoredProc Ошибка выполнения

-===DiMas===-

Помогите разобраться, есть в MSSQL 2000 хранимая процедура:
CREATE
--CREATE
<b>PROCEDURE</b> uReceive
	@C_PH varchar(<b>15</b>),
	@C_VAR *******,
	@S_ST int,
	@Z_POINT smallint
<b>AS</b>
.....
....
....
exec @res=********* @Z_ACC, @S_ST, @C_VAR, @Z_POINT, null, @Z_OP_ST output
	<b>if</b> @res=<b>0</b> <b>set</b> @C_RESULT=<b>0</b>
l_exit:
	select @C_RESULT <b>as</b> C_RESULT
нужно ее выполнить..пишу
AStoredProc := TADOStoredProc.Create(<b>nil</b>);
 AStoredProc.Connection := FMain.ADOConn;
 AStoredProc.ProcedureName := 'uReceive';
 AStoredProc.Parameters.AddParameter.Name := '@C_PH';
 AStoredProc.Parameters.AddParameter.Name := '@C_VAR';
 AStoredProc.Parameters.AddParameter.Name := '@S_ST';
 AStoredProc.Parameters.AddParameter.Name := '@Z_POINT';
 AStoredProc.Parameters.AddParameter.Name := '@C_RESULT';

 <b>with</b> AStoredProc.Parameters.ParamByName('@C_PH') <b>do</b> <b>begin</b>
 DataType := ftString;
 Direction := pdInput;
 Value := PhNumb;
 <b>end</b>;
 <b>with</b> AStoredProc.Parameters.ParamByName('@C_VAR') <b>do</b> <b>begin</b>
 DataType := ftInteger;
 Direction := pdInput;
 Value := AnVar;
 <b>end</b>;
 <b>with</b> AStoredProc.Parameters.ParamByName('@S_ST') <b>do</b> <b>begin</b>
 DataType := ftInteger;
 Direction := pdInput;
 Value := StVar;
 <b>end</b>;
 <b>with</b> AStoredProc.Parameters.ParamByName('@Z_POINT') <b>do</b> <b>begin</b>
 DataType := ftVariant;
 Direction := pdInput;
 Value := Null;
 <b>end</b>;
 <b>with</b> AStoredProc.Parameters.ParamByName('@C_RESULT') <b>do</b> <b>begin</b>
 DataType := ftInteger;
 Direction := pdOutput;
 <b>end</b>;
 AStoredProc.Prepared := true;
 AStoredProc.ExecProc;
В результате выдает ошибку:
First chance exception at $7*******. Exception class EOleException with message 'Procedure or function uReceive has too many arguments specified'.
Мне нужно выполнить процедуру и узнать что она вернула, может другие компоненты использовать?
11 ответов

-===DiMas===-

пробовал писать
...
 <b>with</b> AStoredProc.Parameters.ParamByName('@C_RESULT') <b>do</b> <b>begin</b>
 DataType := ftInteger;
 Direction := [b]pdReturnValue;[/b]
 <b>end</b>;
...
не помогло, таже самая ошибка


-===DiMas===-

Если убрать строки
...
 AStoredProc.Parameters.AddParameter.Name := '@C_RESULT';
...
 <b>with</b> AStoredProc.Parameters.ParamByName('@C_RESULT') <b>do</b> <b>begin</b>
 DataType := ftInteger;
 Direction := pdOutput;
 <b>end</b>;
...
Процедура успешно выполняется, но как получить то что она возвращает:????


-===DiMas===-

Процедура выполняет набор данных?


-===DiMas===-

То есть возвращает набор данных?


-===DiMas===-

возвращает число, 0...4


-===DiMas===-

Parameters.ParamByName('RETURN_VALUE')


-===DiMas===-

возвращает число, 0...4
Если надо вернуть целочисленное, то RETURN (см BOL). Получить на клиенте уже подсказали как,только небольшая поправка:Parameters.ParamByName('@RETURN_VALUE')
может другие компоненты использовать?
TADOCommand ?


-===DiMas===-

FlyD,пишу
ResVal := AStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value;
First chance exception at $7*******. Exception class EDatabaseError with message 'Parameter '@RETURN_VALUE' not found'.


-===DiMas===-

AStoredProc := TADOStoredProc.Create(<b>nil</b>);
 AStoredProc.Connection := FMain.ADOConn;
 AStoredProc.ProcedureName := 'uReceive';
 AStoredProc.Prepared := true;
 <b>if</b> AStoredProc.Parameters.Refresh <b>then</b>
 <b>begin</b>
 AStoredProc.Parameters.ParamByName('@C_PH').Value := PhNumb;
 <i>// ...</i>
 <i>// остальные параметры</i>
 <i>// ...</i>
 AStoredProc.ExecProc;
 ResVal := AStoredProc.Parameters.ParamByName('@RETURN_VALUE').Value;
 <b>end</b>;
?


-===DiMas===-

FlyD,Все разобрался, возвращается DataSet,....
CREATE--CREATEPROCEDURE uReceive @C_PH varchar(15), @C_VAR *******, @S_ST int, @Z_POINT smallintAS.............exec @res=********* @Z_ACC, @S_ST, @C_VAR, @Z_POINT, null, @Z_OP_ST output if @res=0 set @C_RESULT=0l_exit: select @C_RESULT as C_RESULT


-===DiMas===-

FlyD,Все разобрался, возвращается DataSet,....
1. Используй TADODataSet и его метод Open2. В серверной процедуре на забудь прописать SET NOCOUNT ON