Получить возвращаемые значения из хранимой процедуры в c # (процесс входа в систему) - PullRequest
0 голосов
/ 31 мая 2010

Я пытаюсь использовать хранимую процедуру, которая принимает два параметра (login, pw) и возвращает информацию о пользователе.

Если я выполню 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);
                    }                    
                }
            }

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 31 мая 2010

Вы пробовали с Try с 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

Тогда вам нужно использовать ParameterDirection.Output при настройке объекта SqlCommand.

Однако, если ваш SP использует ключевое слово RETURN, например:

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

Тогда вы должны использовать ParameterDirection.ReturnValue. Я подозреваю, что первый случай - хороший.

См. этот предыдущий вопрос

0 голосов
/ 31 мая 2010

Вам необходимо вызвать метод ExecuteReader для объекта cmd и прочитать вывод, используя метод Read класса SqlDataReader .

Вот пример: Метод SqlDataReader.Read.

...