Banreaper Posted November 18, 2015 Report Share Posted November 18, 2015 Bueno chicos, me tocó finalmente preguntar aquí 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 More sharing options...
susodicho Posted November 18, 2015 Report Share Posted November 18, 2015 :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 More sharing options...
Banreaper Posted November 18, 2015 Author Report Share Posted November 18, 2015 (edited) 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 November 19, 2015 by Banreaper Link to comment Share on other sites More sharing options...
susodicho Posted November 19, 2015 Report Share Posted November 19, 2015 (edited) 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 November 19, 2015 by susodicho Link to comment Share on other sites More sharing options...
Banreaper Posted November 19, 2015 Author Report Share Posted November 19, 2015 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? Link to comment Share on other sites More sharing options...
susodicho Posted November 19, 2015 Report Share Posted November 19, 2015 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 More sharing options...
Banreaper Posted November 19, 2015 Author Report Share Posted November 19, 2015 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now