web-dev-qa-db-ja.com

asp.netのストアドプロシージャから戻り値を取得する

ストアドプロシージャがあります

ALTER PROC TESTLOGIN
    @UserName varchar(50),
    @password varchar(50)
As
Begin
    declare @return int;

    set @return  = (SELECT COUNT(*) 
                    FROM CPUser 
                    WHERE UserName = @UserName 
                    AND Password = @password);

    return @return;
End

およびC#で

SqlConnection con = db.con;
SqlCommand cmd = new SqlCommand("TESTLOGIN", con);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter parm = new SqlParameter("@return", SqlDbType.Int);
parm.Direction = ParameterDirection.ReturnValue;

cmd.Parameters.Add(parm);
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim()));

cmd.ExecuteNonQuery();
con.Close();

int id = Convert.ToInt32(parm.Value);

しかし、それは常に0を返します。この問題を解決するのを手伝ってください

19
Ahmad Abbasi

コードでParameterDirection.ReturnValueに設定されたDirectionを持つパラメーターが必要ですが、SPに追加のパラメーターを追加する必要はありません。これを試して

  SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
  returnParameter.Direction = ParameterDirection.ReturnValue;
  cmd.ExecuteNonQuery();

  int id = (int) returnParameter.Value;
38

2つのこと。

  • クエリは、戻り値が送信される前にSQLサーバーで完了する必要があります。

  • 結果をキャプチャしてから、戻り値がオブジェクトに到達する前に実行を終了する必要があります。

英語では、作業を終了してから値を取得します。

これは機能しません:

                cmm.ExecuteReader();
                int i = (int) cmm.Parameters["@RETURN_VALUE"].Value;

これは動作します:

                        SqlDataReader reader = cmm.ExecuteReader();
                        reader.Close();

                        foreach (SqlParameter prm in cmd.Parameters)
                        {
                           Debug.WriteLine("");
                           Debug.WriteLine("Name " + prm.ParameterName);
                           Debug.WriteLine("Type " + prm.SqlDbType.ToString());
                           Debug.WriteLine("Size " + prm.Size.ToString());
                           Debug.WriteLine("Direction " + prm.Direction.ToString());
                           Debug.WriteLine("Value " + prm.Value);

                        }

リーダーによる結果の処理中および処理の前または後に、パラメーターの値を確認できない場合。

2
Slick

これを試すことができます。出力方向としてパラメーターを追加し、クエリの実行後に出力パラメーター値を取得します。

  SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int);
  parmOUT.Direction = ParameterDirection.Output;
  cmd.Parameters.Add(parmOUT);
  cmd.ExecuteNonQuery();
  int returnVALUE = (int)cmd.Parameters["@return"].Value;
1
Tushar Cse

プロシージャは値を返しません。ストアプロシージャで出力パラメータを使用する必要があります。

ALTER PROC TESTLOGIN
@UserName   varchar(50),
@password   varchar(50)
@retvalue int output
 as
 Begin
    declare @return     int 
    set @return  = (Select COUNT(*) 
    FROM    CPUser  
    WHERE   UserName = @UserName AND Password = @password)

   set @retvalue=@return
  End

次に、パラメータの方向が出ているc#からsqlparameterを追加する必要があります。これが理にかなっていることを願っています。

0
user1990587