从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.请帮我解决这个问题
您需要在代码中将Direction设置为ParameterDirection.ReturnValue
,但不需要在SP中添加额外参数。 试试这个
SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; cmd.ExecuteNonQuery(); int id = (int) returnParameter.Value;
2件事。
-
在发送返回值之前,必须在sql server上完成查询。
-
必须捕获结果,然后在返回值到达对象之前完成执行。
在英语中,完成工作然后检索值。
这不起作用:
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); }
如果您不确定在阅读器处理结果期间和之后检查参数的值。
您可以尝试这个。将参数添加为输出方向,并在执行查询后获取输出参数值。
SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int); parmOUT.Direction = ParameterDirection.Output; cmd.Parameters.Add(parmOUT); cmd.ExecuteNonQuery(); int returnVALUE = (int)cmd.Parameters["@return"].Value;
过程永远不会返回值。您必须在存储过程中使用输出参数。
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
然后你必须从参数方向为out的c#中添加一个sqlparameter。 希望这是有道理的。
如果您想知道如何将值从存储过程返回到Visual Basic.NET。 请阅读本教程: 如何从存储过程返回值
我使用以下存储过程来返回值。
CREATE PROCEDURE usp_get_count AS BEGIN DECLARE @VALUE int; SET @VALUE=(SELECT COUNT(*) FROM tblCar); RETURN @VALUE; END GO
这样做(在代码中进行必要的更改)..
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"; }