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