Получить возвращаемое значение из хранимой процедуры в asp.net - программирование
Подтвердить что ты не робот

Получить возвращаемое значение из хранимой процедуры в 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

и в С#

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. Пожалуйста, помогите мне решить эту проблему.

4b9b3361

Ответ 1

Вам нужен параметр с Direction, установленный в ParameterDirection.ReturnValue в коде, но не нужно добавлять дополнительный параметр в SP. Попробуйте это

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

  int id = (int) returnParameter.Value;

Ответ 2

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);

                        }

если вы не уверены проверьте значение параметра до и после того, как результаты были обработаны читателем.

Ответ 3

вы можете попробовать this.Add параметр как направление вывода и после выполнения запроса получить значение выходного параметра.

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

Ответ 4

Процедура никогда не возвращает значение. Вы должны использовать выходной параметр в процедуре хранения.

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 @[email protected]
  End

Затем вам нужно добавить sqlparameter из С#, направление параметра которого отсутствует.  Надеюсь, это имеет смысл.

Ответ 5

Если вы хотите узнать, как вернуть значение из хранимой процедуры в Visual Basic.NET. Пожалуйста, прочтите это руководство: Как вернуть значение из хранимой процедуры

Я использовал следующую хранимую процедуру для возврата значения.

CREATE PROCEDURE usp_get_count

AS
BEGIN
 DECLARE @VALUE int;

 SET @VALUE=(SELECT COUNT(*) FROM tblCar);

 RETURN @VALUE;

END
GO

Ответ 6

Сделайте это так (внесите необходимые изменения в код)..

            SqlConnection con = new SqlConnection(GetConnectionString());
            con.Open();
            SqlCommand cmd = new SqlCommand("CheckUser", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("username", username.Text);
            SqlParameter p2 = new SqlParameter("password", password.Text);
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);
            SqlDataReader rd = cmd.ExecuteReader();
            if(rd.HasRows)
            {
                //do the things
            }
            else
            {
                lblinfo.Text = "abc";
            }