Jump to content

Duda login asp.net + sql


Recommended Posts

Bueno chicos, me tocó finalmente preguntar aquí :notonto:

 

Resulta que estoy comenzando un proyecto en el ramo Desarrollo en .NET de la carrera (término de 4to semestre) y entre todo el proyecto, debo realizar un login en asp.net visual studio 2010, con datos de una miserable tabla en sql server 2008R2. La cosa es que la conexión a la base de datos, debe ser por biblioteca de clase y esta debe validar los datos para ser retornado a la aplicación en sí. El error que se me presenta, es al validar los datos en la biblioteca de clases, donde al entrar a la sentencia while(reader.Read()) pass = reader["passUser"].ToString(); me arroja un error IndexOutOfRangeException{"passUser"}.

Me tinca que es algo super básico pero no he podido encontrar el problema. ayuda.

CREATE TABLE usuarios(
	codUser VARCHAR(20) NOT NULL, //Nombre usuario
	passUser VARCHAR(20) NOT NULL,//Clave usuario
	nomUser VARCHAR(100) NOT NULL //Nombre para retornar en Sesión
	CONSTRAINT FK_USUARIOS PRIMARY KEY(codUser)
);

INSERT INTO usuarios VALUES('banreaper','ban123','Banreaper Melchor');

SELECT * FROM usuarios

CREATE PROCEDURE sp_val_login(@codUsr VARCHAR(10),@passUsr VARCHAR(10))
AS
	BEGIN
		SELECT codUser FROM usuarios
		WHERE @codUsr = codUser AND @passUsr = passUser;
	END

Biblioteca de clase

public class Principal
    {
        public void login(string user, string pass, Label mensaje) { 
            string datos =  ConfigurationManager.AppSettings["conexion"];
            string sql = ConfigurationManager.AppSettings["login"];//Procedimiento almacenado
            sql = sql + " '" + user + "','" + pass + "'";
            SqlDataReader reader;
            SqlConnection conexion = new SqlConnection(datos);
            SqlCommand comando = new SqlCommand(sql, conexion);

            try
            {
                conexion.Open();
                reader = comando.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        user = reader["codUser"].ToString();
                        pass = reader["passUser"].ToString();
                    }
                }
            }
            catch (Exception e)
            {
                mensaje.Text = "Error en conexion a BD. " + e;
            }
            finally
            {
                conexion.Close();
            }

        }

    }

login.aspx

public partial class login : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            loginMensaje.Text = "";
            BCLogAcc.Principal validaDatos = new BCLogAcc.Principal();
            validaDatos.login(txtUser.Text, txtPass.Text, loginMensaje);

            //Server.Transfer("index.aspx"); validar si es correcto y enviar al index
        }

        
    }
Link to comment
Share on other sites

:mmm: La consulta del procedimiento almacenado sólo devuelve el campo codUser (SELECT codUser FROM usuarios WHERE...), así que sólo puedes acceder a ese campo con el SqlDataReader.

 

Desde comienzos de este milenio (cuando alguien descubrió que existen otros idiomas además del inglés) se prefiere guardar las cadenas como Unicode, así que sería bueno que cambiaras los VARCHAR por NVARCHAR para que tu aplicación se vea más moderna ;) .

 

Un detalle, el prefijo usado normalmente para denotar clave primaria es PK, así que creo que deberías cambiar la declaración CONSTRAINT FK_USUARIOS PRIMARY KEY(codUser) por CONSTRAINT PK_USUARIOS PRIMARY KEY(codUser)

 

:huasonto:

Link to comment
Share on other sites

Crap! maldito procedimiento de almacenado... Gracias susodicho! :D

 

Chicos, como puedo validar los datos en el método protected void btnLogin_Click(object sender, EventArgs e){}, con los datos validados por la biblioteca de clase? traté de hacer lo por medio de un 'if' pero no veo como compararlo.

Edited by Banreaper
Link to comment
Share on other sites

  • Cuando quieres validar a un usuario, revisas que el usuario exista y que la contraseña sea la correcta; por lo tanto, al hacer la consulta, ésta te puede devolver una fila o ninguna. Es decir, si el usuario no existe o la contraseña es incorrecta, no te devuelve ninguna fila; en caso contrario (el usuario existe y la contraseña es correcta) te devuelve una sola fila. Así que no hay necesidad de usar un while para recorrer todas las filas devueltas por la consulta, ya que como mucho será una fila.
  • Como tu función login valida el inicio de sesión, sería lógico que sea de tipo booleana (devuelve verdadero si el usuario existe y la contraseña es correcta).
  • La función login no está "devolviendo" el nombre de usuario ni la contraseña porque los 3 parámetros los estás pasando por valor, tienes que pasarlos por referencia.
Así que la función login quedaría más o menos así:

public bool login(string user, string pass, Label mensaje)
{
    bool pulento = false;
    // etc.

    try
    {
        // etc.
        if (reader.HasRows)
        {
            // etc.
            pulento = true;
        }
    }
    catch (Exception e)
    {
        // etc.
    }
    finally
    {
        // etc.
    }
    return pulento;
}
:huasonto: Edited by susodicho
Link to comment
Share on other sites

Perfecto, me quedó claro (aun me estoy dando cabezasos con el código 😅). Por lo tanto, ahora solo debo validarlo en el método btnLogin_Click del login.aspx.cs?

Sí, ahora sólo tienes que revisar qué devuelve la función login y listo. Recuerda cambiar la declaración de los parámetros (los que quieres pasar por referencia). Ojo, no se pueden pasar propiedades por referencia ;)

 

:huasonto:

Link to comment
Share on other sites

 

Perfecto, me quedó claro (aun me estoy dando cabezasos con el código 😅). Por lo tanto, ahora solo debo validarlo en el método btnLogin_Click del login.aspx.cs?

Sí, ahora sólo tienes que revisar qué devuelve la función login y listo. Recuerda cambiar la declaración de los parámetros (los que quieres pasar por referencia). Ojo, no se pueden pasar propiedades por referencia ;)

 

:huasonto:

 

 

Muchas gracias! me ayudaste y aclaraste bastante! :D

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...