2010-05-31 90 views
0

我想使用一個存儲過程,它需要兩個參數(登錄,pw)並返回用戶信息。從c#中的存儲過程獲取返回值(登錄過程)

如果我手動執行的SP,我得到

Session_UID User_Group_Name  Sys_User_Name  
------------------------------------ -------------------------------------------------- - 
NULL   Administrators  NTMSAdmin 
No rows affected. 
(1 row(s) returned) 
@RETURN_VALUE = 0 
Finished running [dbo].[p_SYS_Login]. 

但與下面的代碼,我只得到返回值。 你知道如何獲得上面顯示的其他值,如 Session_UID,User_Group_Name和Sys_User_Name?

如果您在下面的代碼中看到註釋部分。我試圖添加一些輸出參數,但它不適用於不正確的參數數量錯誤。

  string strConnection = Settings.Default.ConnectionString;    
      using (SqlConnection conn = new SqlConnection(strConnection)) 
      { 
       using (SqlCommand cmd = new SqlCommand()) 
       { 
        SqlDataReader rdr = null; 
        cmd.Connection = conn; 
        cmd.CommandText = "p_SYS_Login"; 
        //cmd.CommandText = "p_sys_Select_User_Group"; 
        cmd.CommandType = CommandType.StoredProcedure; 

        SqlParameter paramReturnValue = new SqlParameter(); 
        paramReturnValue.ParameterName = "@RETURN_VALUE"; 
        paramReturnValue.SqlDbType = SqlDbType.Int; 
        paramReturnValue.SourceColumn = null; 
        paramReturnValue.Direction = ParameterDirection.ReturnValue; 

        //SqlParameter paramGroupName = new SqlParameter("@User_Group_Name", SqlDbType.VarChar, 50); 
        //paramGroupName.Direction = ParameterDirection.Output; 

        //SqlParameter paramUserName = new SqlParameter("@Sys_User_Name", SqlDbType.VarChar, 50); 
        //paramUserName.Direction = ParameterDirection.Output; 

        cmd.Parameters.Add(paramReturnValue); 

        //cmd.Parameters.Add(paramGroupName); 
        //cmd.Parameters.Add(paramUserName); 

        cmd.Parameters.AddWithValue("@Sys_Login", textUserID.Text); 
        cmd.Parameters.AddWithValue("@Sys_Password", textPassword.Text); 

        try 
        { 
         conn.Open(); 
         object result = cmd.ExecuteNonQuery(); 
         int returnValue = (int)cmd.Parameters["@RETURN_VALUE"].Value; 
         if (returnValue == 0) 
         { 
          Hide(); 
          Program.MapForm.Show(); 
         } 
         else if (returnValue == 1) 
         { 
          MessageBox.Show("The username or password you entered is incorrect", "NTMS Login", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         } 
         else if (returnValue == 2) 
         { 
          MessageBox.Show("This account is disabled", "NTMS Login", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         } 
         else       
         { 
          MessageBox.Show("Database error. Please contact administrator", "NTMS Login", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
         } 
        } 
        catch (Exception ex) 
        { 
         string message = ex.Message; 
         string caption = "MAVIS Exception"; 
         MessageBoxButtons buttons = MessageBoxButtons.OK; 

         MessageBox.Show(
          message, 
          caption, 
          buttons, 
          MessageBoxIcon.Warning, 
          MessageBoxDefaultButton.Button1); 
        }      
       } 
      } 

感謝您的幫助。

回答

1

您是否嘗試過與ParameterDirection.Output試試?

SqlParameter paramReturnValue = new SqlParameter(); 
paramReturnValue.ParameterName = "@RETURN_VALUE"; 
paramReturnValue.Direction = ParameterDirection.Output; 

... 

conn.Open(); 
cmd.Connection = conn; 
cmd.ExecuteNonQuery(); 

... 

int returnValue = (int)cmd.Parameters["@RETURN_VALUE"].Value; 

如果SP使用OUT參數,就像這樣:

CREATE PROC FOO(@bar INT OUT) AS 
SELECT @bar = 1 

然後你需要設置你的SqlCommand對象時使用的ParameterDirection.Output

但是,如果你的SP使用return關鍵字,像這樣:

CREATE PROC FOO(@bar INT OUT) AS 
RETURN 1 -- NOTE the RETURN 

然後,你必須使用ParameterDirection.ReturnValue。我懷疑前一種情況是好的。

this previous question