2013-02-11 101 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