[Solucionado] Validar Datos de una Tabla (SQL) desde Windows Forms (VB.net)

Iniciado por Ninj4, 26 Agosto 2010, 15:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Ninj4

Buenas a todos, queria consultar como obtener y luevo validar un dato desde una tabla en sql server.
Tengo un formulario con dos textbox (usuario y contraseña) la idea es q al presionar un boton los valores ingresados en los textbox se verifiquen en la tabla del sql, y que dependiendo si estan o no, que aparezca un messagebox "usuario existente" o "usuario inexistente"

Hasta ahora tengo esto, el problema es q no encuentro la manera de validar los datos q pongo en los textbox, si alguien con mas conocimientos me da una mano, se lo agradezco :D

Código (vbnet) [Seleccionar]
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
       Dim Usuario As String

       Dim con As SqlConnection
       Dim conexion As String = "data source = PABLO-PC; initial catalog= Tabla_Prueba; integrated security=yes"
       
       con = New SqlConnection(conexion)

       Dim com As New SqlCommand
       Dim Valor As Object

       com.CommandText = String.Format("SELECT * from Usuarios where Usuario = {0} and Contraseña = {1}", TextBox1.Text, TextBox2.Text)

       com.CommandType = CommandType.Text
       com.Connection = con

       con.Open()

       Valor = com.CommandText


       MessageBox.Show(Valor)


       If TextBox1.Text = Valor Then
           MessageBox.Show("Bienvenido " & TextBox1.Text)
       ElseIf TextBox1.Text <> Valor Then
           MessageBox.Show("La contraseña o el nombre de usuario no son validos")
       End If

       con.Close()

   End Sub


Basicamente mi problema es q no encuentro el comando correcto para hacer las comparaciones entre el valor obtenido de la base de datos y el valor ingresado en el textbox, ya probe utilizando executescalar para identificar el valor de forma numerica, pero al tener string.forma para poder asignar valores a la busqueda me da error.

Gracias de antemano   :D

Hartigan

Pues una forma que se me ocurre es que hagas un select del usuario y la contraseña, y lo almacences el resultado de la búsqueda en un dataTable. si te devuelve una fila esque el usuario existe, entonces muestras el mensaje en pantalla e inicias el programa.. Algo así: (te lo pongo en c# que es en lo que yo programo pero en vb es igual, poniendo tu nomenclatura)

Código (csharp) [Seleccionar]


String sentenciaSql = "select login, pass from usuario where login = '" + login + "' AND pass = '" + password + "'";

            SqlConnection conexion = null;
            try
            {
                conexion = new SqlConnection(cadena_conexion);
                SqlDataAdapter adapter = new SqlDataAdapter(sentenciaSql, conexion);

                DataTable tabla = new DataTable();
                conexion.Open();
                adapter.Fill(tabla);

                if (tabla.Rows.Count == 1)
                {
                    exito = true;
                }
                else
                {
                    exito = false;
                }
            }

....


Yo lo tengo así en mi aplicación pero se podrá de más maneras...

Salu2.

Novlucker

Lo que te han dicho antes, con que la consulta devuelta venga vacía ya alcanza, la comparación la ejecuta el sql al realizar la consulta.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Ninj4

Gracias, ahora mismo me pongo a probar a ver que sale!

saludos

Edit: Pongo el codigo en VB.net por si a alguien le puede llegar a servir, muchas gracias por la ayuda :D

Código (vbnet) [Seleccionar]
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim con As SqlConnection
        Dim conexion As String = "data source = PABLO-PC; initial catalog= Umbrella; integrated security=yes"
        con = New SqlConnection(conexion)

        Dim com As SqlCommand
        Dim buscar As String = "SELECT * from Usuarios where Usuario = '" & TextBox1.Text & "' and Contraseña = '" & TextBox2.Text & "'"

        com = New SqlCommand(buscar, con)

        Dim Adapter As SqlDataAdapter = New SqlDataAdapter(buscar, con)
        Dim tabla_temp As DataTable = New DataTable

        con.Open()

        Adapter.Fill(tabla_temp)
        If tabla.Rows.Count = 1 Then
            MessageBox.Show("Bienvenido " & TextBox1.Text)
        ElseIf tabla.Rows.Count = 0 Then
            MessageBox.Show("La contraseña o el nombre de usuario no son validos")
        End If

        con.Close()

    End Sub


PD: Solo de curioso y para aprender mas, si algiuen sabe otro metodo y tiene ganas de compartirlo, bienvenido sea :P

saludos


ElCampesino

Buen día, quiza ya sea un poco tarde pero este mismo ejemplo me sirvio para poder terminar la validación en mi proyecto por eso me anime a postear la conexión y la validación de usuario echa en un Proyeto en 3 capas y una mas de Entidad, mi proyecto utiliza "Procedimientos Almacenados" para validar el usuario y la contraseña, reciben 2 parametros y regresa 1
la verción que estoy utilizando es 2010 y el servidor SQL 2008

Antes que nada quiero Aclarar que soy un novato y me estoy enseñando a programar, espero no romper las reglas del foro ya que es la primera vez que posteo algo y no estoy familiarizado con esto al 100% quiza mis terminos no sean los mas correctos asi que acepto criticas constructivas
bien. Empecemos!

Primero creamos nuestros procedimientos almacenados

Código (sql) [Seleccionar]

create proc validarSuper
@user varchar(50),
@pass varchar(50),
@Respuesta int output
As
declare @usuario varchar(50)
declare @passw varchar(50)
begin

select @usuario=strNombreSuper, @passw=strPasword
from TabConfiguracion
where strNombreSuper = @user and @pass = strPasword

if ((@user = @usuario) AND (@pass = @passw))
begin
set @Respuesta = 1
end
else
begin
print 'El usuario ó contraseña es Incorrecto'
set @Respuesta = 0
end
return @Respuesta
end


create proc validarUsuario
@user varchar(50),
@pass varchar(50),
@Respuesta int output
as
declare @usuario varchar(50)
declare @passw varchar(50)

begin
select @usuario=shtUsuNombreUsuario, @passw=shtUsuPasword
from CatUsuarios
where shtUsuNombreUsuario = @user and shtUsuPasword = @pass

if ((@user = @usuario) AND (@pass = @passw))
begin
print 'El Usuario es correcto'
set @Respuesta = 1
end
else
begin
print 'El usuario ó contraseña es Incorrecto'
set @Respuesta = 0
end
return @Respuesta
end


Una vez creados llenamos algunos registros para hacer las pruebas de ejecucion
Código (sql) [Seleccionar]

declare @resultado int
exec validarSuper 'SuperDuper','Contraseña',@resultado output
print @resultado


Bien esto solo es un tip en caso de que no sepas como ejecutar un procedimiento despues de crearlo en SQL, pasemos al codigo de Visual Basic

Esta es la clase de LoginForm1 dentro de la capa grafica e importa las capas de Negocio y Entidad
Código (vbnet) [Seleccionar]

Imports Entidad
Imports Negocio

Public Class LoginForm1

    Public Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click

        Dim _login As New entidadLogin 'creo una instancia de la clase entidadLogin dentro de la capa Entidad

'Le paso los valores de usuario y contraseña
        _login.usuario = UsernameTextBox.Text
        _login.pasword = PasswordTextBox.Text

        Dim validar As New valUsuario 'Creo una instancia de la clase valUsuario, dentro de la capa Negocio

'Aqui uso el metodo "validarUser" y le paso el objeto que lleva los parametros se usuario y contraseña
        If validar.validarUser(_login) Then
'Si es verdadero muestra el usuario
            MsgBox(_login.usuario)
        Else
            MsgBox("Estas Chiflado Tio")
        End If

        Me.Close()
    End Sub

' Este es el boton de cerrar
    Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
        Me.Close()
    End Sub

End Class


Esta es la clase de entidadLogin, me sirve espesificamente para pasar valores de una clase a otra

Código (vbnet) [Seleccionar]

Public Class entidadLogin

' Esta clase solo la utilizo para pasar los valores entre las 3 Capas
'Todas la Clases tienen esta referencia ó estan referenciadas a esta clase no se como llamarle
    Dim user, pass As String

    Public Property usuario
        Get
            Return user
        End Get
        Set(value)
            user = value
        End Set
    End Property

    Public Property pasword
        Get
            Return pass
        End Get
        Set(value)
            pass = value
        End Set
    End Property

    Sub New()
        ' TODO: Complete member initialization
    End Sub

'Constructor
    Public Sub New(ByVal usuario As String, pass As String)
        user = usuario
        pasword = pass
    End Sub

End Class


Esta clase es valUsuario de la capa de Negocio e importa la capa de Datos

Código (vbnet) [Seleccionar]

Imports Datos

'Esta clase esta dentro de la capa de Negocio y tiene el metodo "validarUser" que recibe un objeto de tipo Entidad.entidadLogin de la capa Entidad

Public Class valUsuario
    Dim _acceso As New Acceso'Creo una instancia de la clase Acceso, dentro de la Capa Datos

    Public Function validarUser(login As Entidad.entidadLogin)
        If login.usuario.ToString = "SuperDuper" Then 'Si el usuario es "SuperDuper" Entonces
            If _acceso.superAcceso(login) Then 'Ejecuta el metodo "superAcceso" de la clase Acceso para validar el usuario
                MsgBox(login.usuario)

                ' Esto esta pendiente No lo tomes en cuenta
            Else 'Si la contraseña no es correcta entonces
                MsgBox("Contraseña incorrecta")
            End If

        Else 'Si el usuario no es "SuperDuper" entonces es un usuario común
            MsgBox("El usuario es un mortal")
'Uso otro metodo de la clase Acdeso para validar a los usuarios mortales
            If _acceso.accesoUsuario(login) Then' Si el usuario es verdadero Entonces..
                MsgBox("Correcto")
                Return True
            Else'Si no es verdadero Entonces..
                MsgBox("Incorrecto")
                Return False
            End If
        End If

        Return login
    End Function

End Class


Esta otra es la Clase de Acceso dentro de la Capa de Datos

Código (vbnet) [Seleccionar]

Imports System.Data.SqlClient
'Clase Acceso. Contiene 2 metodos, 1 es para validar al SuperUsuario y el otro es pra validar a los mortales
Public Class Acceso

    Dim cnn As New Conexion 'Esta es la clase de conexión dentro de la capa de Datos
    Dim cmd As New SqlClient.SqlCommand'Este objeto me sirve para enviar la consulta a la base de datos
    Dim Resultado As Integer 'Valor de resultado en consulta


    Public Function superAcceso(_login As Entidad.entidadLogin)

        Try
            cmd.Connection = cnn.conectar 'Me conecto y le asigno la conexión al objeto cmd
            cmd.CommandText = "ValidarSuper" ' Este es el nombre del Procedimiento almacenado
            cmd.CommandType = System.Data.CommandType.StoredProcedure 'Le indico que el comando es un Prodecimiento almacenado

            cmd.Parameters.AddWithValue("@user", _login.usuario.ToString)'le paso el valor de usuario del procedimiento almacenado
            cmd.Parameters.AddWithValue("@pass", _login.pasword.ToString)'le paso el valor de pasword del procedimiento almacenado

            cmd.Parameters.Add(New SqlParameter("@Respuesta", SqlDbType.Int))'le digo cual sera el parametro de regreso
            cmd.Parameters("@Respuesta").Direction = ParameterDirection.Output'le asigno la direccion del parametro
            cmd.ExecuteNonQuery()'Ejecuto el procedimiento

            Resultado = cmd.Parameters("@Respuesta").Value.ToString'Recibo el Resultado

            If Resultado = 1 Then
                Return True

            Else
                Return False

            End If

        Catch ex As Exception
            MsgBox(ex)
        End Try

        Return True

    End Function


    Public Function accesoUsuario(_login As Entidad.entidadLogin)

        Try
            cmd.Connection = cnn.conectar
            cmd.CommandText = "validarUsuario"
            cmd.CommandType = System.Data.CommandType.StoredProcedure

            cmd.Parameters.AddWithValue("@user", _login.usuario.ToString)
            cmd.Parameters.AddWithValue("@pass", _login.pasword.ToString)

            cmd.Parameters.Add(New SqlParameter("@Respuesta", SqlDbType.Int))
            cmd.Parameters("@Respuesta").Direction = ParameterDirection.Output
            cmd.ExecuteNonQuery()

            Resultado = cmd.Parameters("@Respuesta").Value.ToString

            If Resultado = 1 Then
                Return True

            Else
                Return False

            End If

        Catch ex As Exception
            MsgBox(ex)
        End Try

        Return True

    End Function

End Class


Y esta ultima clase es la de conexión que tambien se encuentra dentro de la capa de Datos

Código (vbnet) [Seleccionar]

Imports System.Data.SqlClient
'Esta es la Clase conexión
Public Class Conexion

    Dim cnn As SqlConnection

    Public Function conectar()
        Dim Servidor As String = "ZARAK-PC\SQLEXPRESS"
        Dim BaseDatos As String = "BDTiempo"
        Dim CadenaConexion As String = "Data Source =" & Servidor & ";Initial Catalog=" & BaseDatos & ";Integrated Security=SSPI;"

        Try
            cnn = New SqlConnection(CadenaConexion)
            cnn.Open()
            Return cnn
        Catch ex As Exception
            MsgBox(ex.Message)
            Return False
        End Try
    End Function

    Public Function desconectar()
        Try
            If cnn.State = ConnectionState.Open Then
                cnn.Close()
                Return True
            Else
                Return False
            End If
        Catch ex As Exception

            MsgBox(ex.Message)
            Return False
        End Try
    End Function
End Class


Espero sea claro y le pueda servir a alguien

************
Tansolo soy un humilde campesino que ha caido en desgracia y quiere compartir algo