0

.net のストアド プロシージャから値を返そうとしていますが、値が返されません。

これが私のストアドプロシージャです...

ALTER procedure [dbo].[usp_CreateUser]
    @UserName varchar(50),
    @Result bit output
as
begin
    declare @temp varchar(50)

    select @temp = UserName  
    from tbl_UserLoginDetails
    where UserName = @UserName

    if ((@temp is null) or (@temp=''))   
       set @Result = 1
    else
       set @Result = 0

    return @Result
end

そして、ここに私の.netコードがあります..

SqlConnection vConn = new SqlConnection(ConnectionString);

SqlCommand vComm = new SqlCommand("usp_CreateUser",vConn);
vComm.CommandType = CommandType.StoredProcedure;

vComm.Parameters.AddWithValue("UserName","Tanuj");

SqlParameter retval = vComm.Parameters.Add("@Result", SqlDbType.Bit);
retval.Direction = ParameterDirection.ReturnValue;

vConn.Open();
vComm.ExecuteNonQuery();
vConn.Close();

Console.WriteLine(vComm.Parameters["@Result"].Value);

次のエラーが表示されます...

プロシージャまたは関数 'usp_CreateUser' には、指定されていないパラメーター '@Result' が必要です。

0 か 1 を返すことを期待しています。

前もって感謝します

4

1 に答える 1

3

OUTPUT パラメータと戻り値を混同しています。

戻り値は、RETURNコマンドを介して返される INT です。これは、実際のデータではなく、proc の実行に関する「終了コード」に使用する必要があります (ただし、実行しようとしているときにデータを返すために使用することがよくあります)。

OUTPUT パラメータは任意のデータ型にすることができ、SETまたはを介し​​て設定されSELECTます。入力パラメータと同様に、デフォルト値を指定しないことは、それが必須であることを意味します。

エラーが発生するのは@Result、.NET コードで代わりに ReturnValue として宣言しているときに、ストアド プロシージャで OUTPUT パラメーターとして宣言したためです (したがって、.NET コードで OUTPUT パラメーターを指定していません)。

あなたがすべき:

  1. return @Result公正に変わるRETURN;

  2. ParameterDirectionに変更Output

  3. 経由で値にアクセスします(bool)retval.Value


また、ストアド プロシージャ コードが不要な作業を行っています。必要なのは次のとおりです。

IF (EXISTS(
           SELECT 1
           FROM   tbl_UserLoginDetails
           WHERE  UserName = @UserName
   ))
BEGIN
  SET @Result = 0;
END;
ELSE
BEGIN
  SET @Result = 1;
END;

RETURN;

また、参考までに、Parameters.AddWithValue().NET が現在の値からデータ型を正しく推測しないと問題が発生する可能性があるため、実際には使用しないでください。代わりに、「retval」の場合と同じように、Parameters.Add()を指定できるように使用するのが最善です。SqlDbType

于 2015-01-07T05:33:50.907 に答える