Principales respuestas
Problemas con mi formulario login

Pregunta
-
Tengo un formulario que sirve para que los usuarios se logeen , en si hace una comparacion en la base de datos para saber si existe tal usuario, en este codigo que pongo abajo cuando el usuario y el pass existen le redirecciona a la pagina principal, pero cuando los datos son erroneos el formulario no redirecciona permanece ahi mismo. Pero el problema es que no me muestre el mensaje de error de "Datos erroneos", cual creen que sea el problema ?
Public Class Login Inherits System.Web.UI.Page Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Dim con As New SqlConnection(conString) Dim da As New SqlDataAdapter("select * from [dbo].[Dat_Alumno]", con) Dim ds As New DataSet Public IDAlumno As String = "" Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load lblmsger.Text = ""
lblmsger.Visible = False txtusuario.Focus() End Sub Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click Dim fila As DataRow Dim nombre As String = "" da.SelectCommand.CommandText = "select top 1 * from [dbo].[Dat_Alumno] where IDAlumno = '" & txtusuario.Text & "' and DNI = '" & txtpass.Text & "'" da.Fill(ds, "dato") If ds.Tables("dato").Rows.Count = 0 Then Response.Redirect("Login.aspx")
lblmsger.Text = "Datos erroneos" lblmsger.Visible = True End If For Each fila In ds.Tables("dato").Rows nombre = fila("Nombres") IDAlumno = fila("IDAlumno") Next Session.Add("Nombres", nombre) Session.Add("IDAlumno", IDAlumno) Response.Redirect("~/Modalidades/InfoModalidades.aspx") End Sub End Class
Respuestas
-
hola
lo primero que puedo comentar es que deberia usar parmetros en las queries que definas
segundo para validar el login no se usa un datatable ,se usa el ExecuteScalar()
tercero NUNCA se definen los objetos de conexion a datos de forma global
Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click If Not Autenticar(txtusuario.Text, txtpass.Text) Then lblmsger.Text = "Datos erroneos" lblmsger.Visible = True Return End If Dim dt As DataTable = ObtenerUsuario(txtusuario.Text) Dim row As DataRow = dt.Rows(0); Session.Add("Nombres", row("Nombres")) Session.Add("IDAlumno", row("IDAlumno")) Response.Redirect("~/Modalidades/InfoModalidades.aspx") End Sub Private Function Autenticar(usuario As String, password As String) As Boolean Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Using con As New SqlConnection(conString) con.Open() Dim query As String = "select COUNT(*) from [dbo].[Dat_Alumno] where IDAlumno = @usuario and DNI = @password" Dim cmd As New SqlCommand(query, con) cmd.Parameter.AddWithValue("@usuario", usuario) cmd.Parameter.AddWithValue("@password", password) Return Convert.ToInt32(cmd.ExecuteScalar()) End Using End Function Private Function ObtenerUsuario(usuario As String) As DataTable Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Using con As New SqlConnection(conString) con.Open() Dim query As String = "select * from [dbo].[Dat_Alumno] where IDAlumno = @usuario" Dim cmd As New SqlCommand(query, con) cmd.Parameter.AddWithValue("@usuario", usuario) Dim dt As New DataTable Dim da As New SqlDataAdapter(cmd) da.Fill(dt) Return dt End Using End Function
como veras se usan funciones para hacer mas prolijo el codigo
ademas estas seguro que en el WHERE asignas las columasn correctas, me pare que un DNI no deberia comparase con el password, eso esta raro, deberias verificarlo
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta fredsale martes, 14 de abril de 2015 3:55
Todas las respuestas
-
El problema es que cuando no validas el usuario haces también un Redirect con lo que la página se vuelve a cargar por completo y el código posterior no tiene ningún efecto sobre la visualización:
Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click Dim fila As DataRow Dim nombre As String = "" da.SelectCommand.CommandText = "select top 1 * from [dbo].[Dat_Alumno] where IDAlumno = '" & txtusuario.Text & "' and DNI = '" & txtpass.Text & "'" da.Fill(ds, "dato") If ds.Tables("dato").Rows.Count = 0 Then lblmsger.Text = "Datos erroneos" lblmsger.Visible = True Else nombre = ds.Tables("dato").Rows(0)("Nombres") IDAlumno = ds.Tables("dato").Rows(0)("IdAlumno") Session.Add("Nombres", nombre) Session.Add("IDAlumno", IDAlumno) Response.Redirect("~/Modalidades/InfoModalidades.aspx") End If End Sub
- Propuesto como respuesta Luis Vivanco martes, 14 de abril de 2015 0:09
-
hola
lo primero que puedo comentar es que deberia usar parmetros en las queries que definas
segundo para validar el login no se usa un datatable ,se usa el ExecuteScalar()
tercero NUNCA se definen los objetos de conexion a datos de forma global
Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click If Not Autenticar(txtusuario.Text, txtpass.Text) Then lblmsger.Text = "Datos erroneos" lblmsger.Visible = True Return End If Dim dt As DataTable = ObtenerUsuario(txtusuario.Text) Dim row As DataRow = dt.Rows(0); Session.Add("Nombres", row("Nombres")) Session.Add("IDAlumno", row("IDAlumno")) Response.Redirect("~/Modalidades/InfoModalidades.aspx") End Sub Private Function Autenticar(usuario As String, password As String) As Boolean Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Using con As New SqlConnection(conString) con.Open() Dim query As String = "select COUNT(*) from [dbo].[Dat_Alumno] where IDAlumno = @usuario and DNI = @password" Dim cmd As New SqlCommand(query, con) cmd.Parameter.AddWithValue("@usuario", usuario) cmd.Parameter.AddWithValue("@password", password) Return Convert.ToInt32(cmd.ExecuteScalar()) End Using End Function Private Function ObtenerUsuario(usuario As String) As DataTable Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Using con As New SqlConnection(conString) con.Open() Dim query As String = "select * from [dbo].[Dat_Alumno] where IDAlumno = @usuario" Dim cmd As New SqlCommand(query, con) cmd.Parameter.AddWithValue("@usuario", usuario) Dim dt As New DataTable Dim da As New SqlDataAdapter(cmd) da.Fill(dt) Return dt End Using End Function
como veras se usan funciones para hacer mas prolijo el codigo
ademas estas seguro que en el WHERE asignas las columasn correctas, me pare que un DNI no deberia comparase con el password, eso esta raro, deberias verificarlo
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta fredsale martes, 14 de abril de 2015 3:55