Получить возвращаемое значение из хранимой процедуры в 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. Пожалуйста, помогите мне решить эту проблему.
Ответы
Ответ 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";
}