2017-02-21 12 views
0

У меня есть хранимая процедура. Он должен возвращать GUID/ID, но после выполнения он возвращает значение 2 или -1. Я хочу, чтобы он возвращал только идентификатор GUID/ID. Пожалуйста, помогите мне решить эту проблему.Как вернуть GUID/ID из хранимой процедуры

Вот код

Хранимая процедура:

create procedure SampleAddUser1 
    (@Name nvarchar(MAX), 
    @MailID nvarchar(MAX), 
    @MobileNumber varchar(12), 
    @Password nvarchar(MAX), 
    @OTPNo varchar(10), 
    @OTPExp datetime, 
    @UserID uniqueidentifier output) 
as 
    if (not exists (select * from tbl_UserDetails where [email protected])) 
    begin 
     begin transaction 
      set @UserID = NEWID() 

      insert into tbl_UserDetails(UserID, Name, Password, MobileNumber, MailID) 
      values (@UserID, @Name, @Password, @MobileNumber, @MailID) 

      insert into tbl_OTPDetails(UserId, OTPNo, OTPExp) 
      values (@UserID, @OTPNo, @OTPExp) 

      commit transaction 
end 

C# код здесь .....

SqlParameter sqlParam = new SqlParameter("@UserID", SqlDbType.UniqueIdentifier); 
sqlParam.Direction = ParameterDirection.Output; 
param[6] = sqlParam; 

r = _obj.ExecuteNonquery("SampleAddUser1", CommandType.StoredProcedure, param.ToArray()); 

Obj.ExecuteNonQuery:

public int ExecuteNonquery(string commandText, 
    CommandType commandType, SqlParameter[] parameters) 
    { 
     try 
     { 
      cmd = new SqlCommand(commandText,con); 
      cmd.CommandType = commandType; 

      foreach (SqlParameter p in parameters) 
      { 
       if (p.Value == null) 
       { 
       } 
       cmd.Parameters.Add(p); 
      } 
      int output= cmd.ExecuteNonQuery(); 
      con.Close(); 
      return output; 
     } 
     catch (Exception ex) 
     { 
      throw new ArgumentException(ex.Message); 
     } 
     finally 
     { 
      con.Close(); 
     } 
    } 
+0

Вы могли бы указать, как вы заполняете остальные параметры в 'param []' list? – andrews

+0

Спасибо за повтор. @andrews ... вот параметр [] SqlParameter [] param = new SqlParameter [7]; param [0] = новый SqlParameter ("@ Name", objBAL.Name); param [1] = новый SqlParameter («@ Password», objBAL.Password); param [2] = новый SqlParameter ("@ MailID", objBAL.MailId); param [3] = новый SqlParameter ("@ MobileNumber", objBAL.MobileNumber); param [4] = новый SqlParameter ("@ OTPNo", objOTP.OTPN0); param [5] = новый SqlParameter ("@ OTPExp", objOTP.OTPExp); – NaveenGNK

+0

и как вы пытаетесь прочитать параметр '@ UserID' после завершения вызова ExecuteNonquery? Пожалуйста, добавьте весь текст в текст вопроса, а не комментарии. – andrews

ответ

2

Вы можете» t получить возвращаемое значение или выходной параметр от возвращаемого значения ExecuteNonQuery(). Это приведет только к возврату затронутых строк.

Чтобы получить значение выходного параметра:

var conn = new SqlConnection("my connection string"); 
var cmd = conn.CreateCommand(); 
cmd.CommandText = "dbo.MyProc"; 
cmd.CommandType = CommandType.StoredProcedure; 

var sqlParam = new SqlParameter("@UserID", 
SqlDbType.UniqueIdentifier); 
sqlParam.Direction = ParameterDirection.Output; 

cmd.Parameters.Add(sqlParam); 
cmd.ExecuteNonQuery(); 
// you can now access your output param 
return (Guid)sqlParam.Value; 
+0

OP не использует' ExecuteScalar() ', он использует' ExecuteNonQuery() '. – andrews

+0

typo .. мой ответ по-прежнему применяется –

+0

Плюс один для объяснения возвращаемого значения 'ExecuteNonQuery'. Может захотеть добавить, что если 'set nocount' is' on', значение будет '-1' – pinkfloydx33

3

должно быть довольно просто, чтобы получить .Value свойство выходного параметра:

SqlParameter sqlParam = new SqlParameter("@UserID", SqlDbType.UniqueIdentifier); 
sqlParam.Direction = ParameterDirection.Output; 
param[6] = sqlParam; 
r = _obj.ExecuteNonquery("SampleAddUser1", CommandType.StoredProcedure, param.ToArray()); 

// get the returned parameter 
Guid? userId = sqlParam.Value as Guid?; 

Одна вещь, которую я заметил о вашей хранимой процедуры что a NEWID() не будет сгенерирован (в случае, если в базе данных уже есть запись с тем же @MobileNumber). В этом случае лучше быть безопасным и использовать Guid? в качестве возвращаемого типа.