从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"; }