Не удается получить возвращаемое значение из хранимой процедуры

#c# #sql-server #stored-procedures

#c# #sql-сервер #хранимые процедуры

Вопрос:

Я знаю, что этот вопрос задавался много раз, я просмотрел большинство из них, но ни один не решил мою проблему

У меня вызывается хранимая процедура LoginValidation , которая принимает 2 параметра, имя пользователя и пароль и возвращает user_id имя соответствующего пользователя.

Вот код процедуры:

     @username nvarchar(50),
    @password nvarchar(50),
    @userID int output
AS
    SELECT @userID = user_id
    FROM Users_Master 
    WHERE user_name = @username and password = @password;

    RETURN
  

Но, когда я пытаюсь использовать эту процедуру в C #, возникает следующая ошибка:

Процедура или функция ‘LoginValidation’ ожидает параметр ‘@userId’, который не был указан

Вот мой код на C #:

 protected void btnLogin_Click(object sender, EventArgs e)
{
    cmd.Connection = con;

    con.Open();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "LoginValidation";

    cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = txtmobile.Text;
    cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = txtpwd.Text;

    SqlParameter returnParm = cmd.Parameters.AddWithValue("@userID", SqlDbType.VarChar);
    returnParm.Direction = ParameterDirection.ReturnValue;

    string id = returnParm.Value.ToString();

    try
    {
        dr = cmd.ExecuteReader();
    }
    catch (SqlException EX)
    {
        string ff = EX.Message;
    }

    if (dr.HasRows)
    {
        while (dr.Read())
        {
            Session["name"] = dr["user_name"].ToString();

            lblmsg.Text = "Login successful: "   id;
        }
    }
    else
    {
        lblmsg.Text = "Invalid username/password";
    }

    dr.Close();
    con.Close();
}
  

Пожалуйста, какие-либо предложения?

Комментарии:

1. Возвращаемое значение не совпадает с выходным параметром, который у вас есть, установите направление на вывод, а не на возврат.

2. У вас также есть SqlDbType.VarChar , но это должно быть int

3. Также рекомендуется использовать хэширование ваших паролей

4. Вам также не нужны материалы для чтения, просто выполните cmd.

Ответ №1:

Попробуйте с returnParm.Direction = ParameterDirection.Output;

Ответ №2:

Имейте в виду, что вы используете неправильный метод AddWithValue при передаче типа данных. Вам нужно изменить это на:

 SqlParameter returnParm = cmd.Parameters.Add("@userID", SqlDbType.VarChar);
returnParm.Direction = ParameterDirection.Output;
  

Также вам необходимо задать направление на Output

Затем вам нужно прочитать значение после выполнения запроса:

 dr = cmd.ExecuteReader();
string id = returnParm.Value.ToString();
  

Документы:

Ввод: параметр является входным параметром.

InputOutput: параметр способен как к вводу, так и к выводу.

Вывод: параметр является выходным параметром.

Возвращаемое значение: параметр представляет возвращаемое значение из операции, такой как хранимая процедура, встроенная функция или определяемая пользователем функция.

Ответ №3:

Сначала вы решаете, что хотите получить выходной параметр или параметр возвращаемого значения.

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

     SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    cmd.ExecuteNonQuery();
    
     int id = (int) returnParameter.Value;
      
  2. чтобы получить выходной параметр. Все шаги, которые вы выполнили, в порядке. просто замените

     returnParm.Direction = ParameterDirection.ReturnValue;
      

с

   returnParm.Direction = ParameterDirection.Output;
  

Комментарии:

1. На самом деле в моем коде я допустил несколько ошибок, и эти разные ответы разрешили это, но я могу считать ваш ответ лучшим ответом, поскольку он охватил все проблемы моего кода. Большое спасибо

2.Кроме того, имейте в виду, что единственным типом данных, который может быть возвращен из хранимой процедуры с помощью RETURN инструкции, является int (или bigint ), но вы не можете вернуть строку, дату, время или другие значения — для них вы должны использовать OUTPUT параметры.

Ответ №4:

вы делаете ошибку. Вызов

 string id = returnParm.Value.ToString();
  

после

 dr = cmd.ExecuteReader();