Как получить вывод параметра с сервера SQL с C# и поместить значение в переменную сеанса - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь получить роль пользователя на выбранном SQL сервере для блокировки некоторых страниц в зависимости от значения сеанса. Но на самом деле я получаю нулевое значение. Чтобы получить роль, у меня есть хранимая процедура с выходным параметром.

CREATE PROCEDURE obtenerROl 
     @user varchar(20), 
     @passwrd varchar(20), 
     @rol tinyint OUTPUT
AS
BEGIN
    SELECT @rol = idROl 
    FROM Users 
    WHERE nameUSer = @user AND password = @passwrd 

    RETURN @rol
END

На странице login.aspx.cs я пытаюсь получить значение для выходного параметра и поместить его в переменную сеанса.

public void obtenerRol()
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connDb"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "obtenerROl";

        cmd.Parameters.Add("@user", SqlDbType.VarChar).Value = txtUsuario.Text.Trim();
        cmd.Parameters.Add("@passwrd ", SqlDbType.VarChar).Value = txtContraseña.Text.Trim();
        SqlParameter rol = new SqlParameter("@rol", SqlDbType.TinyInt);
        rol.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(rol);

        cmd.Connection = conn;
        cmd.ExecuteReader(CommandBehavior.CloseConnection); 

        conn.Open();                    
        Session["UserRole"] = cmd.Parameters["@rol"].Value.ToString();
    }
}

После входа в систему на главной странице у меня есть ярлык только для проверки значения сеанса.

 mensajeID.Text = Session["UserRole"].ToString();

Но я получаю сообщение об ошибке в этой строке:

System.Web.SessionState.HttpSessionState.this [string] .get вернул null.

Итак, я предполагаю, что метод не работает.

последняя добавленная мной строка была

cmd.ExecuteReader(CommandBehavior.CloseConnection);

, потому что я прочитал, что необходимо закрыть загрузчик данных для обработки выходных параметров, но это не сработало. Надеюсь, вы поможете мне с моей проблемой, привет.

1 Ответ

0 голосов
/ 27 мая 2020

Привет, я могу разместить здесь только код, и это было бы так, как я его написал (не смог проверить):

Я предполагаю, что ваша схема базы данных по умолчанию dbo => dbo.obtenerROl.

public void obtenerRol()
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connDb"].ConnectionString))
        using (SqlCommand cmd = new SqlCommand("dbo.obtenerROl", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;


            cmd.Parameters.Add("@user", SqlDbType.VarChar).Value = txtUsuario.Text.Trim();
            cmd.Parameters.Add("@passwrd ", SqlDbType.VarChar).Value = txtContraseña.Text.Trim();
            SqlParameter rol = new SqlParameter("@rol", SqlDbType.TinyInt);
            rol.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(rol);

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

            //according to https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/sql-clr-type-mapping
            byte userRole = (byte) cmd.Parameters["@rol"].Value;
            Session["UserRole"] = userRole;

            conn.Close();
        }
    }

и

CREATE PROCEDURE obtenerROl 
   @user varchar(20), 
   @passwrd varchar(20), 
   @rol tinyint OUTPUT
AS
BEGIN
   SELECT @rol = idROl 
   FROM Users 
   WHERE nameUSer = @user AND password = @passwrd 

   RETURN 0; -- for success
END

вы также можете

CREATE PROCEDURE obtenerROl 
    @user varchar(20), 
    @passwrd varchar(20)
AS
BEGIN
   DECLARE @rol tinyint = 0; -- default role
   SELECT @rol = idROl 
   FROM Users 
   WHERE nameUSer = @user AND password = @passwrd;

   SELECT @rol;
END

и ваш C# Код:
ExecuteScalar получит @ rol.

public void obtenerRol()
{
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["connDb"].ConnectionString))
    using (SqlCommand cmd = new SqlCommand("dbo.obtenerROl", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add("@user", SqlDbType.VarChar).Value = txtUsuario.Text.Trim();
        cmd.Parameters.Add("@passwrd ", SqlDbType.VarChar).Value = txtContraseña.Text.Trim();

        conn.Open();
        var value = cmd.ExecuteScalar();

        //according to https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/sql-clr-type-mapping
        byte userRole = (byte)value;
        Session["UserRole"] = userRole;

        conn.Close();
    }
}

Для завершения:

...