2013-02-11 31 views
17

tôi có một thủ tục lưu trữNhận Quay trở lại giá trị gia tăng từ Thủ tục lưu trữ trong 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 

và trong 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); 

nhưng nó luôn luôn quay trở lại 0. Xin hãy giúp tôi giải quyết vấn đề này

+0

bạn có chắc chắn quy trình không trả về 0 không? – adt

+0

@adt nếu trực tiếp thực hiện thủ tục trong SQL Server, nó hoạt động chính xác nhưng trong C#, nó luôn cho 0 –

+0

bản sao có thể có của [Nhận giá trị trả về từ thủ tục được lưu trữ trong C#] (http://stackoverflow.com/questions/706361/ get-return-value-from-stored-procedure-in-c-sharp) –

Trả lời

30

Bạn cần tham số có Hướng được đặt thành ParameterDirection.ReturnValue trong mã nhưng không cần phải thêm thông số bổ sung trong SP. Hãy thử điều này

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

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

cảm ơn, chạy tốt. (Thông báo hơn tại thời điểm này 'Parameters.Add' không được chấp nhận) – danihp

+1

' Parameters.Add (string parameterName, object value) 'không được chấp nhận, nhưng' Parameters.Add (string parameterName, SqlDbType sqlDbType) 'thì không. –

+0

Tôi trả về giá trị chuỗi nhưng nó cho một exeption 'Chuyển đổi thất bại khi chuyển đổi giá trị varchar 'giá trị trả về của tôi' để kiểu dữ liệu int.' – SMI

1

bạn có thể thử điều này. Thêm tham số làm hướng đầu ra và sau khi thực hiện truy vấn nhận giá trị tham số đầu ra.

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

Hãy làm theo cách này (thực hiện thay đổi cần thiết trong mã) ..

  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

Đây không phải là một lựa chọn tốt vì nó bổ sung thêm chi phí của trình đọc dữ liệu.Thông số đầu ra là cách hiệu quả nhất. – Lukos

0

Thủ tục không bao giờ trả về một value.You phải sử dụng một tham số đầu ra trong thủ tục lưu trữ.

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 

Sau đó, bạn phải thêm sqlparameter từ C# có tham số hướng ra ngoài. Hy vọng điều này có ý nghĩa.

+8

Bạn bị nhầm lẫn, một thủ tục lưu sẵn trong SQL Server * luôn luôn * trả về một giá trị, luôn luôn là giá trị 'int'. Bạn có thể chưa bao giờ lấy giá trị trả về trong các truy vấn của mình, nhưng điều đó không có nghĩa là một SP không có. Vui lòng xem (hướng dẫn) xem [RETURN manual] (http://msdn.microsoft.com/en-us/library/ms174998.aspx "RETURN (Transact-SQL)"). –

+0

Tôi đã truy xuất giá trị trả lại trong các truy vấn của mình. Nhưng tôi đã quên đề cập đến điều này. Ngoài ra tôi đã nghiên cứu tại RETURN hướng dẫn sử dụng có liên kết được cung cấp bởi bạn. Cảm ơn bạn đã liên kết và cải cách câu trả lời của tôi. – user1990587

+0

không hoạt động –

2

2 điều.

  • Truy vấn phải hoàn tất trên máy chủ sql trước khi giá trị trả lại được gửi.

  • Kết quả phải được chụp và sau đó hoàn thành việc thực hiện trước giá trị trả lại được chuyển đến đối tượng.

Bằng tiếng Anh, hãy hoàn thành công việc và sau đó truy xuất giá trị.

nay sẽ không hoạt động:

   cmm.ExecuteReader(); 
       int i = (int) cmm.Parameters["@RETURN_VALUE"].Value; 

Đây sẽ làm việc:

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

         } 

nếu không chắc rà soát các giá trị của tham số trước trong và sau khi kết quả đã được xử lý bằng cách độc giả.

-2

Nếu bạn muốn biết cách trả về một giá trị từ thủ tục lưu sẵn cho Visual Basic.NET. Vui lòng đọc hướng dẫn này: How to return a value from stored procedure

Tôi đã sử dụng thủ tục được lưu trữ sau để trả về giá trị.

CREATE PROCEDURE usp_get_count 

AS 
BEGIN 
DECLARE @VALUE int; 

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

RETURN @VALUE; 

END 
GO 
+0

Chào mừng bạn đến [như vậy]. Khi trả lời câu hỏi, hãy đảm bảo tiết lộ bất kỳ liên kết nào với bất kỳ tham chiếu hoặc liên kết nào trong bài đăng. Cảm ơn! –

Các vấn đề liên quan