Получить return(RetValue) из SP

Ex_Soft
Дата: 31.01.2005 02:02:52
Вроде делаю все как в букваре написано
cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText="sp_Name";
...
OleDbParameter
  Ret=cmd.Parameters.Add("@return",OleDbType.Integer);

Ret.Direction=ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

// Ret.Value==DBNull - и хоть ты тресни Ж8-/

Кто виноватЪ? Что делатЪ?
_________________
"Helo, word!" - 17 errors 56 warnings
hDrummer
Дата: 31.01.2005 10:04:47
А что за СУБД и текст ХП можно узнать?
Ex_Soft
Дата: 31.01.2005 16:12:19
create procedure sp_PhoneSave
  @PHONE_ID D_PHONE,
  @CITY_ID D_CITY,
  @PHONE_TYPE_ID D_CLIENT_PARAM,
  @CLIENT_ID D_CLIENT,
  @PHONE_NUMBER Varchar(15),
  @RECORD_STATE D_RECORD_STATE,
  @USER_ID D_CLIENT_RELATION,
  @RECORD_MODIFY D_RECORD_MODIFY_TIMESTAMP output,
  @NEW_PHONE_ID D_PHONE output
as
  declare
    @OldPhoneId D_PHONE,
    @RSNew D_RECORD_STATE,
    @RSActive D_RECORD_STATE,
    @RSArchive D_RECORD_STATE,
    @RetValue smallint

  select @RSNew=50
  select @RSActive=100
  select @RSArchive=150

  select @OldPhoneId=PHONE_ID
  from PHONE
  where PHONE_ID=@PHONE_ID

  if @OldPhoneId is not null
    begin
      update PHONE set
        RECORD_STATE=@RSArchive,
        USER_ID=@USER_ID,
        RECORD_MODIFY=getdate()
    end

  select @RECORD_MODIFY=getdate()

  insert into PHONE
  (CITY_ID, PHONE_TYPE_ID, CLIENT_ID, PHONE_NUMBER, RECORD_STATE, USER_ID, RECORD_MODIFY)
  values
  (@CITY_ID, @PHONE_TYPE_ID, @CLIENT_ID, @PHONE_NUMBER, @RECORD_STATE, @USER_ID, @RECORD_MODIFY)

  if @@rowcount!=1
    begin
      select @NEW_PHONE_ID=0
      select @RetValue=-100
    end
  else
    begin
      select @NEW_PHONE_ID=@@identity
      select @RetValue=0
    end

  return(@RetValue)

Sybase ASE 12.5
Из-под SQL Advantage - все oB!

_________________
"Helo, word!" - 17 errors 56 warnings
Ex_Soft
Дата: 31.01.2005 18:27:00
наваял для простоты дрозофилу
create procedure mulmul @mult1 int, @mult2 int,  
  @result int output  
as  
declare @RetVal int 
select @result = @mult1 * @mult2 
select @RetVal=@result 
return(@RetVal)

результат - тот же

Sybase ASE 12.5
Из-под SQL Advantage - все oB!
_________________
"Helo, word!" - 17 errors 56 warnings
Alexey Sh
Дата: 31.01.2005 19:23:17
попробуй тип возвращаемого значения - SqlDbType.Int
Ex_Soft
Дата: 03.02.2005 10:32:29
шо мертвому припарки Ж8-/

P.S. шо прЫкольно: SqlDbType.Int прохавал ;)
_________________
"Helo, word!" - 17 errors 56 warnings
Ex_Soft
Дата: 09.02.2005 19:08:44
заборол таким макаром:
cmd.CommandText="exec ? = sp_Name";
...
OleDbParameter
  Ret=cmd.Parameters.Add("@return",OleDbType.Integer);

Ret.Direction=ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

выходит не стоит юзать CommandType=CommandType.StoredProcedure;
_________________
"Helo, word!" - 17 errors 56 warnings
Ex_Soft
Дата: 11.02.2005 23:33:25
Сорри за дезинформацию :( Ж8-/

cmd.CommandText="exec ? = sp_Name";
...
OleDbParameter
  Ret=cmd.Parameters.Add("@return",OleDbType.Integer);

Ret.Direction=ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();

на другой маше с другими версиями сервака, клиента, провайдера (толком из-за чего не разбирался) не прокатило Ж8-/

но вот, вроде, уже окончательный вариант

create procedure mulmul
  @mult1 int,
  @mult2 int,
  @result int output
as
  declare
    @RetVal int

  select @result=@mult1 * @mult2
  select @RetVal=@result

  return(@RetVal)

#if USE_COMMAND_TYPE_STORED_PROCEDURE
  cmd.CommandType=CommandType.StoredProcedure;
  cmd.CommandText="mulmul";
#else
  cmd.CommandType=CommandType.Text;
  cmd.CommandText="{? = call mulmul(?, ?, ?)}";
#endif

OleDbParameter
  SPRetValue=cmd.Parameters.Add("@return",SqlDbType.Int);

SPRetValue.Direction=ParameterDirection.ReturnValue;
cmd.Parameters.Add("@mult1",OleDbType.Integer).Value=5;
cmd.Parameters.Add("@mult2",OleDbType.Integer).Value=5;

OleDbParameter
  SPResult=cmd.Parameters.Add("@result",OleDbType.Integer);

SPResult.Direction=ParameterDirection.Output;

cmd.ExecuteNonQuery();
                                
int
  Result=Convert.ToInt32(SPResult.Value),
  RetValue=Convert.ToInt32(SPRetValue.Value);

if(Result==RetValue)
  {
     Console.WriteLine("oB!");
  }
else
  {
     Console.WriteLine("Tampax");
  }

Вся фишка, оказалась в том, что при использовании cmd.CommandType=CommandType.StoredProcedure
return-значение надо ставить ПЕРВЫМ в списке параметров!!! Ж8-/

_________________
"Helo, word!" - 17 errors 56 warnings