2011-04-14 179 views
4

我一直在嘗試從我的數據庫中檢索一些信息,並檢索返回值。我知道存儲過程正常工作。調用帶輸出的存儲過程

我使用的代碼是我用於註冊用戶的修改後的代碼。它在我的代碼的cmd.ExecuteReader部分出錯了。

protected void btn_login_Click(object sender, ImageClickEventArgs e) 
{ 
    //Actions after Submit button is clicked 
    Page.Validate(((ImageButton)sender).ValidationGroup); 

    if (Page.IsValid) 
    { 
     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DbConnectString"].ConnectionString)) 
     { 
      SqlCommand cmd = new SqlCommand("usp_validateUsers", conn); 
      //Input Values 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.AddWithValue("username", Uname.Text); 
      cmd.Parameters.AddWithValue("password", pwd.Text); 
      //Return Values 
      SqlParameter retParam = cmd.Parameters.Add("@RetVal", SqlDbType.Int); 
      retParam.Direction = ParameterDirection.ReturnValue; 
      SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int); 
      acsParam.Direction = ParameterDirection.Output; 
      SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar); 
      nikParam.Direction = ParameterDirection.Output; 

      try 
      { 
       // Open Connection and execute Stored Proc 
       conn.Open(); 
       ///////////SOMETHING GOES WRONG HERE/////////////// 
       cmd.ExecuteReader(); 

       //Retrieve Data 
       int retVal = (int)retParam.Value; 
       string nickname = nikParam.Value.ToString(); 
       string ac_stats = acsParam.Value.ToString(); 

       if (retVal != 0) 
       { 
        //Invalid Username or password 
       } 
       else 
       { 
        //Login User 
       } 
      } 

      catch (Exception Error) 
      { 
       lbl_login.Text = "An error occured, please try again later"; 
       debug.Text = Error.Message; 
      } 

      finally 
      { 
       debug.Text = "\n Clossing Connection"; 
       if (conn.State == System.Data.ConnectionState.Open) 
       { 
        conn.Close(); 
       } 

      } 
     } 
    } 
} 

當我只是想獲得的返回值,我只是用cmd.ExecuteScalar();我知道如何接收數據時,我傳遞SQL查詢到SQL數據庫,但它似乎使用存儲過程時是不同的。

編輯 可能可以進一步改進此代碼,但它確實做了它應該做的事情。

ALTER PROCEDURE dbo.usp_validateUsers 

@username varchar(10), 
@password varchar(10), 
@ac_status char(1) OUTPUT, 
@memb_name varchar(15) OUTPUT 

AS 
IF EXISTS(SELECT * FROM MEMB_INFO WHERE (memb___id = @username)) 
BEGIN 
    SELECT @ac_status = ac_status, @memb_name = memb_name 
    FROM MEMB_INFO 
    WHERE (memb___id = @username) AND (memb__pwd = @password) 
    RETURN 0 
END 

ELSE 
BEGIN 
    return 1 
END 

當我使用斷點趕在Visual Studio中可能的例外,它給了我: 字符串[4]:Size屬性爲0

+0

什麼是運行'ExecuteReader'當你的錯誤:

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar); 

試試這個? – Jacob 2011-04-14 01:18:05

+0

有關字符串[4]的錯誤大小爲0. – Raskaroth 2011-04-14 01:20:40

+1

您的字符串參數需要有一個長度。 – 2011-04-14 01:32:47

回答

6

您提到的錯誤可能是由於您未指定參數VarChar的大小所致。而不是有這樣的臺詞:

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar, 15); 
+0

感謝您的幫助:)希望我自己看到了那個愚蠢的錯誤... – Raskaroth 2011-04-14 01:45:20

0

無效大小您需要創建一個SqlDataReader。

Ins and Outs of using Stored Procedures in C#

的SqlDataReader類是用來讀取 記錄 從數據庫返回的只進流。所述 SqlDataReader對象不是 直接通過 構造(因此缺乏新 鍵字的),而是通過的SqlCommand 對象的 ExecuteReader方法實例化。在調用 ExecuteReader方法之前,連接到 的數據庫是使用SqlConnection對象的 Open方法建立的。

嘗試

SqlDataReader drLogins; 
Conn.Open(); 
drLogins = cmd.ExecuteReader(); 
+0

我仍然得到相同的錯誤.. – Raskaroth 2011-04-14 01:34:15

+0

這根本不是問題,但無論如何,謝謝! – Raskaroth 2011-04-14 01:41:56

0

@ac_status被定義爲參數整數。改變它的字符或字符串。

SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int); 
+0

我的不好,但是將字符串[4]更改爲字符串[3]錯誤:P – Raskaroth 2011-04-14 01:28:14