none
Error con un LoginForm en VB.Net RRS feed

  • Pregunta

  • Saludos!

    Necesito ayuda en algo, soy nuevo en Visual Basic.Net y agradeceria mucho su ayuda.

    Mi problema es el siguiente:

      Estoy creando un Sistema y en el tengo un "LoginForm"  con la siguiente sintaxis:

    Imports System.Data Imports System.Data.SqlClient Public Class LoginForm1 Dim conexion As SqlConnection Dim adaptador As SqlDataAdapter Dim myReader As SqlDataReader Dim cmd As SqlCommand Private Sub LoginForm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Conexion = New SqlConnection("Data Source=(local);Initial Catalog=Login;Integrated Security=True; Server=THELEGEND-PC\SQLEXPRESS") Conexion.Open() Catch ex As Exception MsgBox("No se pudo conectar" + ex.ToString) End Try Label1.Text = TimeOfDay End Sub Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick Label1.Text = TimeOfDay End Sub Private Sub OK_Click_1(sender As System.Object, e As System.EventArgs) Handles OK.Click Dim intentos As Integer If TB_usuario.Text = "" Or TB_pass.Text = "" Then TB_usuario.Clear() TB_pass.Clear() TB_usuario.Focus() MsgBox("El campo usuario o el campo contraseña está en blanco, por favor ingrese los datos completos.") ElseIf TB_usuario.Text = " " Or TB_pass.Text = " " Then TB_usuario.Clear() TB_pass.Clear() TB_usuario.Focus() MsgBox("El campo usuario o el campo contraseña está en blanco, por favor ingrese los datos completos.") Else Try conexion = New SqlConnection("Data Source=(local);Initial Catalog=Login;Integrated Security=True; Server=THELEGEND-PC\SQLEXPRESS") Dim slct As String = ("SELECT*FROM Usuario WHERE (Nombre de Usuario ='" & TB_usuario.Text & "') AND (Contraseña ='" & TB_pass.Text & "')") adaptador = New SqlDataAdapter(slct, conexion) Dim cmd As New SqlCommand(slct) cmd.Connection = conexion conexion.Open() myReader = cmd.ExecuteReader While myReader.Read() Dim Nombre_Usuario As String = myReader("Nombre de Usuario") Dim Contraseña As String = myReader("Contraseña") If Nombre_Usuario = TB_usuario.Text And Contraseña = TB_pass.Text Then PagPrincipal.Show() Me.Hide() Else intentos = intentos + 1 MsgBox("Contraseña Invalida", MsgBoxStyle.Critical) If intentos = 3 Then MsgBox("Ha agotado el número máximo de intentos, pongase en contacto con el Administrador, el Sistema se va ha Cerrar", MsgBoxStyle.Critical) intentos = 0 Me.Close() End If End If End While Catch ex As Exception MsgBox(ex.ToString) End Try End If End Sub


    Cuando lo ejecuto que introduzco el "Nombre de Usuario" y la "Contraseña" me da error en la linea 48

    (cmd = ExecuteReader).

    Por Favor le agradeceria bastante su grata ayuda.
    Saludos desde Rep. Dom.
    #TheLegend

    domingo, 31 de julio de 2016 19:53

Respuestas

  • Luís Adolfo Pimentel,

    Te dejo algunas recomendaciones:

    1. Define variables de ámbito local, olvida las variables a nivel de clase.
    2. Olvida concatenar valor de parámetros a la consulta sql, has uso de la colección Parameters.
    3. Olvida abrir una conexión "global", abre la conexión sólo donde y cuando la necesites, para ello averigua la instrucción using
    4. Si sólo requieres obtener un valor para saber si el usuario existe, ¿por qué un objeto DataReader? ¿No basta usar el método ExecuteScalar()?

    Atendiendo tu caso, no es correcto como nombras la columna 'Nombre de usuario', debes de enmarcarlo entre comillas simples o corchetes:

    Dim slct As String = ("SELECT * FROM Usuario WHERE ([Nombre de Usuario] = '" 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 31 de julio de 2016 20:04
  • 1. No debes concatenar valores en tu query

    2 . Usa WHILE si vas a recuperar varias lineas  , en tu caso es un login vas a recuperar una sola linea usa IF

    3. No puedes dejar espacios en blancos en tal caso seria NombreDeUsuario (pegado)

    Fijate en este ejemplo ..pruebalo

     Private Sub AgregarDatosItemsSinCubrir(ByVal NombreUsuario As String ,ByVal Contraseña As String )

            Dim lector As SqlDataReader
            Dim SQL As String = "SELECT NombreUsuario , Contraseña FROM USUARIOS Nombreusuario = @nombreUsuario AND contraseña=@contraseña"
            Dim comando As SqlCommand = New SqlCommand(SQL, conexion)

            Try
           
                    comando.Connection.Open()
                    comando.Parameters.Clear()
                    comando.Parameters.AddWithValue("@NombreUsuario", NombreUsuario)
                    comando.Parameters.AddWithValue("@Contraseña", Contraseña)

                    lector = comando.ExecuteReader()
                    If (lector.Read()) Then
                        Dim NombreUsuario As String  = lector("NombreUsuario").ToString()
                        Dim Contraseña As String = lector("Contraseña").ToString()
                    End If
                    lector.Close()
                    comando.Connection.Close()

            Catch ex As Exception
                comando.Connection.Close()
                MessageBox.Show(ex.ToString)
            End Try
        End Sub


    EFRAIN MEJIAS C VALENCIA - VENEZUELA



    domingo, 31 de julio de 2016 20:15

Todas las respuestas

  • Luís Adolfo Pimentel,

    Te dejo algunas recomendaciones:

    1. Define variables de ámbito local, olvida las variables a nivel de clase.
    2. Olvida concatenar valor de parámetros a la consulta sql, has uso de la colección Parameters.
    3. Olvida abrir una conexión "global", abre la conexión sólo donde y cuando la necesites, para ello averigua la instrucción using
    4. Si sólo requieres obtener un valor para saber si el usuario existe, ¿por qué un objeto DataReader? ¿No basta usar el método ExecuteScalar()?

    Atendiendo tu caso, no es correcto como nombras la columna 'Nombre de usuario', debes de enmarcarlo entre comillas simples o corchetes:

    Dim slct As String = ("SELECT * FROM Usuario WHERE ([Nombre de Usuario] = '" 


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 31 de julio de 2016 20:04
  • 1. No debes concatenar valores en tu query

    2 . Usa WHILE si vas a recuperar varias lineas  , en tu caso es un login vas a recuperar una sola linea usa IF

    3. No puedes dejar espacios en blancos en tal caso seria NombreDeUsuario (pegado)

    Fijate en este ejemplo ..pruebalo

     Private Sub AgregarDatosItemsSinCubrir(ByVal NombreUsuario As String ,ByVal Contraseña As String )

            Dim lector As SqlDataReader
            Dim SQL As String = "SELECT NombreUsuario , Contraseña FROM USUARIOS Nombreusuario = @nombreUsuario AND contraseña=@contraseña"
            Dim comando As SqlCommand = New SqlCommand(SQL, conexion)

            Try
           
                    comando.Connection.Open()
                    comando.Parameters.Clear()
                    comando.Parameters.AddWithValue("@NombreUsuario", NombreUsuario)
                    comando.Parameters.AddWithValue("@Contraseña", Contraseña)

                    lector = comando.ExecuteReader()
                    If (lector.Read()) Then
                        Dim NombreUsuario As String  = lector("NombreUsuario").ToString()
                        Dim Contraseña As String = lector("Contraseña").ToString()
                    End If
                    lector.Close()
                    comando.Connection.Close()

            Catch ex As Exception
                comando.Connection.Close()
                MessageBox.Show(ex.ToString)
            End Try
        End Sub


    EFRAIN MEJIAS C VALENCIA - VENEZUELA



    domingo, 31 de julio de 2016 20:15
  • Muchas gracias por tu cooperación, gracias a ello logre resolver mi problema y ahorrarme líneas de código.
    Muchas gracias de antemano desde Rep. Dom. #TheLegend.

    LAPC

    sábado, 6 de agosto de 2016 14:44
  • Tu error se encuentra aqui:

       Dim slct As String = ("SELECT*FROM Usuario WHERE (Nombre de Usuario ='" & TB_usuario.Text & "') AND (Contraseña ='" & TB_pass.Text & "')")


    En ves de Nombre de usuario usa [Nombre de Usuario], te quedaria asi:

       Dim slct As String = ("SELECT * FROM Usuario WHERE ([Nombre de Usuario] ='" & TB_usuario.Text & "') AND (Contraseña ='" & TB_pass.Text & "')")



    Alexander Jimenez


    • Editado AJ Designs martes, 9 de agosto de 2016 1:18
    martes, 9 de agosto de 2016 1:16