none
Como saber si lo que devuelve una clase es un Objeto

    Pregunta

  • Buenas tardes a todos

    De antemano les agradezco su ayuda con la siguiente cuestión.

    Eh estado programando en C#.NET y VB.Net es diferentes proyectos; en C# .NET en una solución que se conforman de diferentes proyectos de la forma de N-Capa( entidad, datos, negocios, reportes, presentación) esto con la finalidad de hacer el "using ...." de esos proyectos y en VB.Net en una solución que tiene las N-Capas que estan todas juntas en el mismo proyecto solo que divididos en carpetas.

    La cuestión es, o mas bien la cuestión surgió cuando empece crear un solución en  VB.NET que utiliza las N-Capas pero en diferentes proyectos, es decir tener un proyecto con las Clases que maneje las entidades, los datos, la lógica de negocio, la presentación y los reportes por separado y utilizar el "Import ....", parecido a lo que tengo en C#.NET.

    Construí mi primera clase que es tener el acceso a otro formulario; _(el típico "Usuario, Password") en la cual declaro mi variable del tipo del objeto y le paso los parámetros. 

    Buen no para no extenderme, No se como saber si lo que regresa de mi clase es un objeto con datos, valores, etc.

    Este es el codigo

      Public Function validarUsuario(ByVal obj As EntUsuarios)
            Try
                conectar()
                cmd = New SqlCommand("validarUsuario")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cn
                cmd.Parameters.AddWithValue("@Usuario", obj.gusuario)
                cmd.Parameters.AddWithValue("@Password", obj.gpassword)
                Dim DR As SqlDataReader
                DR = cmd.ExecuteReader
               If DR.HasRows = True Then
                    Dim SU As New EntUsuarios
                    SU.gidusuario = Convert.ToInt32(DR("idusuario").ToString())
                    SU.gnombre = DR("nombre").ToString()
                    SU.gapellidos = DR("apellidos").ToString()
                    SU.gusuario = DR("usuario").ToString()
                    SU.gacceso = DR("acceso").ToString()
                    Return SU
                Else
                    Return False
                End If
            Catch ex As Exception
                Return False
            Finally
                desconectar()
            End Try
        End Function

    Si ven aquí trato de regresar el objeto con los valores que corresponden al usuario con el ID y Password correcto; si no regresa un False; 

    En este código envío los datos a la función que 


        Private Sub BtnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAceptar.Click
            Try
                Dim DTU As New EntUsuarios
                Dim VAC As New NegUsuarios
                DTU.gusuario = TxtUsuario.Text
                DTU.gpassword = TxtPass.Text
               If VAC.validarAcceso(DTU) <> Nothing Then
                    Form2.Show()
               Else
                    MsgBox("Intente Nuevamente", MsgBoxStyle.Information, "Acceso Denegado!!")
                    TxtUsuario.Clear()
                    TxtPass.Clear()
                End If
            Catch ex As Exception
                MsgBox(ex.InnerException)
            End Try
        End Sub

    Cuando Ejecuto la solución no me marca ni error ni warnigs.  Aparece la ventana, coloco los datos correctos y me sale el mensaje de Intentar Nuevamente, el cual esta en el ELSE si no se cumple con la condición; es aquí donde me doy cuenta que no se como saber si lo que regresa la función es un objeto con valores. Y observo que el <> Nothing no funciona o mi lógica no es la correcta.

    Se que podría accesar mandando un True desde la clase y compararlo y si es igual pues proceder a abrir el siguiente formulario; pero deseo traer la información especifica de ese usuario.

    Bueno les agradecería mucho su apoyo y sugerencia; Saludos cordiales!!!

    miércoles, 14 de septiembre de 2016 22:41

Respuestas

  • Hola MVK23,

    [-] ... Como saber si lo que devuelve una clase es un Objeto ..

    Sólo tienes que validar si lo que devuelve es Nothing o no.

    En tu código no veo que leas el valor del SQLDataReader usando el DR.Read, además el método se llama validarUsuario, pero en el evento click usas otra función validarAcceso.

    Prueba haciendo estos cambios :

    Public Function validarUsuario(ByVal obj As EntUsuarios) As EntUsuarios
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim cmd As New SqlCommand("validarUsuario", con)
                    cmd.CommandType = CommandType.StoredProcedure
    
                    cmd.Parameters.AddWithValue("@Usuario", obj.gusuario)
                    cmd.Parameters.AddWithValue("@Password", obj.gpassword)
    
                    Dim DR As SqlDataReader = cmd.ExecuteReader
    
                    If DR.HasRows Then
                        Dim SU As New EntUsuarios
                        If DR.Read Then
                            SU.gidusuario = CInt(DR("idusuario"))
                            SU.gnombre = CStr(DR("nombre"))
                            SU.gapellidos = CStr(DR("apellidos"))
                            SU.gusuario = CStr(DR("usuario"))
                            SU.gacceso = CStr(DR("acceso"))
                        End If
                        Return SU
                    End If
    
                    Return Nothing
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return Nothing
            End Try
        End Function

    Recomiendo usar el using en el SQLConnection, así se cierra la conexión automáticamente y se libera el objeto usado.

    Y en el evento click.

    Private Sub BtnAceptar_Click(sender As Object, e As EventArgs) Handles BtnAceptar.Click
    
            Dim VAC As New NegUsuarios
            Dim DTU As New EntUsuarios With
                {.gusuario = TxtUsuario.Text, .gpassword = TxtPass.Text}
    
            If VAC.validarUsuario(DTU) Is Nothing Then
                MsgBox("Intente Nuevamente", MsgBoxStyle.Information, "Acceso Denegado!!")
                TxtUsuario.Clear()
                TxtPass.Clear()
                TxtUsuario.Focus()
            Else
                Form2.Show()
            End If
    
        End Sub

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta MVK23 jueves, 15 de septiembre de 2016 14:26
    jueves, 15 de septiembre de 2016 0:39

Todas las respuestas

  • Hola MVK23,

    [-] ... Como saber si lo que devuelve una clase es un Objeto ..

    Sólo tienes que validar si lo que devuelve es Nothing o no.

    En tu código no veo que leas el valor del SQLDataReader usando el DR.Read, además el método se llama validarUsuario, pero en el evento click usas otra función validarAcceso.

    Prueba haciendo estos cambios :

    Public Function validarUsuario(ByVal obj As EntUsuarios) As EntUsuarios
            Try
                Using con As New SqlConnection("MiCadenaConexion")
                    con.Open()
    
                    Dim cmd As New SqlCommand("validarUsuario", con)
                    cmd.CommandType = CommandType.StoredProcedure
    
                    cmd.Parameters.AddWithValue("@Usuario", obj.gusuario)
                    cmd.Parameters.AddWithValue("@Password", obj.gpassword)
    
                    Dim DR As SqlDataReader = cmd.ExecuteReader
    
                    If DR.HasRows Then
                        Dim SU As New EntUsuarios
                        If DR.Read Then
                            SU.gidusuario = CInt(DR("idusuario"))
                            SU.gnombre = CStr(DR("nombre"))
                            SU.gapellidos = CStr(DR("apellidos"))
                            SU.gusuario = CStr(DR("usuario"))
                            SU.gacceso = CStr(DR("acceso"))
                        End If
                        Return SU
                    End If
    
                    Return Nothing
                End Using
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return Nothing
            End Try
        End Function

    Recomiendo usar el using en el SQLConnection, así se cierra la conexión automáticamente y se libera el objeto usado.

    Y en el evento click.

    Private Sub BtnAceptar_Click(sender As Object, e As EventArgs) Handles BtnAceptar.Click
    
            Dim VAC As New NegUsuarios
            Dim DTU As New EntUsuarios With
                {.gusuario = TxtUsuario.Text, .gpassword = TxtPass.Text}
    
            If VAC.validarUsuario(DTU) Is Nothing Then
                MsgBox("Intente Nuevamente", MsgBoxStyle.Information, "Acceso Denegado!!")
                TxtUsuario.Clear()
                TxtPass.Clear()
                TxtUsuario.Focus()
            Else
                Form2.Show()
            End If
    
        End Sub

    Pruébalo y comentas como te va.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta MVK23 jueves, 15 de septiembre de 2016 14:26
    jueves, 15 de septiembre de 2016 0:39
  • MVK23,

    De inicio, en todos los desarrollos que tengas en Visual Basic no debes olvidar colocar la restricción Option Strict en On, entre varias ventajas te evitará el típado implícito que obtienes al definir -por ejemplo- una firma de función sin el tipo de dato que retorna, fíjate en la siguiente imagen:


    Tras lo expuesto, debes prender la restricción (Option Strict) e indicar a la función 'validarUsuario' el tipo de dato que retorna (mediante la cláusula As), que entiendo debería retornar un tipo EntUsuarios. En caso el usuario exista retornará un tipo de la clase definida, caso contrario retornará Nothing.

    Algo a considerar es que sí sólo deseas validar existencia no es necesario traspasar las capas con entidades, basta con implementar un método que reciba dos parámetros de tipo string y retorne un tipo Boolean indicando el resultado de la validación.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 15 de septiembre de 2016 0:59
  • Hola buen dia

    Gracias por tu apoyo; si me funciono esa modificaciones que mencionas; solo tengo el detalle de como acceder a los datos que regreso la clase.

    Con respecto a que llamo a la función validarAcceso es por que uso las N-Capas de la programación orientada a objetos

    Entidad - Datos - Negocio - Presentación.

    y en Negocios tengo esto:

    Public Function validarAcceso(ByVal obj As EntUsuarios)
            Dim Acceso As New DatUsuarios
            Return Acceso.validarUsuario(obj)
        End Function

    y en datos:

      Public Function validarUsuario(ByVal obj As EntUsuarios)
            Try
                conectar()
                cmd = New SqlCommand("validarUsuario")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cn
                cmd.Parameters.AddWithValue("@Usuario", obj.gusuario)
                cmd.Parameters.AddWithValue("@Password", obj.gpassword)
                Dim DR As SqlDataReader
                DR = cmd.ExecuteReader
                If DR.HasRows Then
                    Dim SU As New EntUsuarios
                    If DR.Read Then
                        SU.gidusuario = Convert.ToInt32(DR("idusuario").ToString())
                        SU.gnombre = DR("nombre").ToString()
                        SU.gapellidos = DR("apellidos").ToString()
                        SU.gusuario = DR("usuario").ToString()
                        SU.gacceso = DR("acceso").ToString()
                    End If
                    Return SU
                Else
                    Return Nothing
                End If
            Catch ex As Exception
                Return Nothing
            Finally
                desconectar()
            End Try
        End Function

    Ahora supongo que como el objeto contiene los datos del usuario que se valido estos los puedo utilizar en otras actividades de la solución.

    Saludos y nuevamente gracias!!!

    jueves, 15 de septiembre de 2016 14:43