2013-02-11 84 views
17

我有一个存储过程从存储过程获取返回值在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。请帮我解决这个问题

+0

你确定程序没有返回0吗? – adt 2013-02-11 10:26:26

+0

@adt如果直接执行SQL Server中的过程,它可以正常工作,但在c#中,它始终会给出0 – 2013-02-11 10:29:37

+0

可能的重复[在C#中从存储过程获取返回值](http://stackoverflow.com/questions/706361/从存储过程中获取回报值在c-sharp) – 2013-02-11 10:40:38

回答

30

您需要一个参数,其中代码中的方向设置为ParameterDirection.ReturnValue,但不需要在SP中添加额外的参数。试试这个

SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    cmd.ExecuteNonQuery(); 

    int id = (int) returnParameter.Value; 
+0

谢谢,运行良好。 (注意,此时'参数.Add'已被弃用) – danihp 2013-10-10 13:29:48

+1

'参数.Add(字符串参数名,对象值)'被弃用,但'Parameters.Add(字符串参数名,SqlDbType sqlDbType)'不是。 – 2013-11-25 13:46:11

+0

我正在返回字符串值,但它提供了一个exeption转换varchar值'我的返回值'为数据类型int.转换失败。' – SMI 2014-03-21 07:39:41

1

你可以试试这个。添加参数作为输出方向,执行完查询后得到输出参数值。

SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int); 
    parmOUT.Direction = ParameterDirection.Output; 
    cmd.Parameters.Add(parmOUT); 
    cmd.ExecuteNonQuery(); 
    int returnVALUE = (int)cmd.Parameters["@return"].Value; 
-3

做这种方式(请在代码中必要的修改)..

  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"; 
      } 
+0

这不是一个很好的选择,因为它增加了数据读取器的开销。输出参数是最有效的方式。 – Lukos 2013-02-11 13:55:40

0

过程将不会返回value.You必须使用存储过程一个输出参数。

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 

然后,你必须从c#中的参数方向是out的sqlparameter。 希望这是有道理的。

+8

你错了,SQL Server *中的存储过程总是返回一个值,它总是一个'int'值。您可能从未在您的查询中检索到返回值,但这并不意味着SP没有。请参阅[返回手册](http://msdn.microsoft.com/zh-cn/library/ms174998.aspx“RETURN(Transact-SQL)”)。 – 2013-02-11 14:05:59

+0

我已经在我的查询中检索到了返回值。但我忘了提及这一点。我也学习了RETURN手册,其链接由您提供。感谢您的链接并改革我的答案。 – user1990587 2013-02-11 14:29:24

+0

其不工作 – 2013-02-13 07:49:34

2

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); 

         } 

,如果你不能确定之前,期间和结果已经得到处理后 检查参数 的价值读者。

-2

如果你想知道如何从存储过程返回一个值到Visual Basic.NET。请阅读本教程:How to return a value from stored procedure

我使用以下存储过程来返回值。

CREATE PROCEDURE usp_get_count 

AS 
BEGIN 
DECLARE @VALUE int; 

SET @VALUE=(SELECT COUNT(*) FROM tblCar); 

RETURN @VALUE; 

END 
GO 
+0

欢迎来到[so]。在回答问题时,请务必披露与帖子中任何引用或链接有关的任何联系。谢谢! – 2014-03-16 12:31:35