2017-02-21 7 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の残りのパラメータをどのように設定するかをplsで指定できますか? – andrews

+0

リプレイをありがとうございます。 @andrews ...ここにparam [] SqlParameter [] param =新しい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

と、 'ExecuteNonquery'呼び出しの終了後に' @ UserID'パラメータをどのように読み返そうとしていますか?コメントではなく、質問テキストにすべてのコードを追加してください。 – andrews

答えて

2

することができます」ここ

ストアドプロシージャのコードです戻り値を得るか、または戻り値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'の戻り値を説明するためにプラス1つ。もし 'set nocount'が' 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?; 

一つですNEWID()が生成されることが保証されていない(データベース内に同じ@MobileNumberのレコードがすでに存在する場合)。その場合は、戻り値の型としてGuid?を使用することをお勧めします。

関連する問題