#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:
Сначала вы решаете, что хотите получить выходной параметр или параметр возвращаемого значения.
-
чтобы получить параметр возвращаемого значения. Вам не нужно передавать какие-либо дополнительные параметры в хранимую процедуру. просто добавьте строки ниже
SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; cmd.ExecuteNonQuery(); int id = (int) returnParameter.Value;
-
чтобы получить выходной параметр. Все шаги, которые вы выполнили, в порядке. просто замените
returnParm.Direction = ParameterDirection.ReturnValue;
с
returnParm.Direction = ParameterDirection.Output;
Комментарии:
1. На самом деле в моем коде я допустил несколько ошибок, и эти разные ответы разрешили это, но я могу считать ваш ответ лучшим ответом, поскольку он охватил все проблемы моего кода. Большое спасибо
2.Кроме того, имейте в виду, что единственным типом данных, который может быть возвращен из хранимой процедуры с помощью
RETURN
инструкции, являетсяint
(илиbigint
), но вы не можете вернуть строку, дату, время или другие значения — для них вы должны использоватьOUTPUT
параметры.
Ответ №4:
вы делаете ошибку. Вызов
string id = returnParm.Value.ToString();
после
dr = cmd.ExecuteReader();