none
Ayuda con C# RRS feed

  • Pregunta

  • Buenas tardes a todos! Tengo un problema con un metodo:

    public class UsuarioNegocio
        {
            public Usuario BuscarUsuario(string usuario)
            {
                Usuario user = new Usuario();
                TipoUsuario tipoUsuario = new TipoUsuario();
                Persona persona = new Persona();
                AccesoDatos acceso = new AccesoDatos();
                try
                {
                    acceso.conectar();
                    acceso.setearQuery("SELECT Id,Nombre,Contrasenia,IdTipo,IdPersona FROM Usuario WHERE Nombre ='" + usuario + "'");
                    SqlDataReader lector = acceso.leer();
    
                    lector.Read();
                    user.id = lector.GetInt32(0);
                    user.nombre = lector.GetString(1);
                    user.contrasenia = lector.GetString(2);
                    user.Tipo.IdTipo = lector.GetInt32(3);
                    user.Persona.id = lector.GetInt32(4);
    
                    acceso.cerrarConexion();
                }
                catch (Exception)
                {
                    throw;
                }
                return user;
            }
        }

    Me dice "La conversión especificada no es valida"

    La clase Usuario es

     

    public class Usuario
        {
            public Int32 id { get; set; }
            public string nombre { get; set; }
            public string contrasenia { get; set; }
            public TipoUsuario Tipo { get; set; }
            public Persona Persona { get; set; }
        }

    La clase Tipo Usuario es: 

     
    public class TipoUsuario
        {
             public Int32 IdTipo { get; set; }
            public string NombreTipo { get; set; }
        }

    Agradecería su ayuda para encontrar el error!



    lunes, 18 de enero de 2021 17:59

Respuestas

  • Hola TheNumberOfTheBeast

    Aunque encontré el error (o uno de ellos, porque podría haber más), tiene razón Eric, facilita mucho la ayuda dar detalles y la linea del error. 

    En tu clase Usuario hay 3 miembros de tipos básicos y los 2 últimos son aparentemente objetos más complejos, que seguramente no fueron instanciados. La solución es, en lugar de crear en el método un objeto TipoUsuario y uno Persona que no se usan en absoluto, asignarle esos objetos a sus correspondientes miembros de la variable user. Más fácil todavía es instanciar esos 2 objetos en su misma declaración en la clase o en su constructor, así después no tenes que estar preocupándote. 

    Lo anterior es un error. Pero me parece, por el mensaje de error que mostraste, que hay otro (porque el anterior sería NullReferenceException), y me suena que podría ser en acceso.leer(). Si todavía en efecto hay errores, ¿podrías mostrar el código de acceso.leer() e indicar la linea del error?

    Saludos

    Pablo

    • Marcado como respuesta EricRRModerator miércoles, 20 de enero de 2021 23:45
    lunes, 18 de enero de 2021 21:27
  • Hola, el problema puede deberse a los tipos de dato de la columna específica del reader. Esto es, que puede que venga algún NULL en algún campo. Ejecuta tu consulta y revisa el conjunto de resultados. También decirte que concatenar la query es mala práctica. Usa consultas parametrizadas como se indica aquí . También revisa si en los campos coincide el tipo esperado. Ejemplo: Id es numérico?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 20 de enero de 2021 18:45
    Moderador

Todas las respuestas

  • Hola,

    Has debugeado el código linea por linea dentro del programa, para ver en que linea es que se cae y presenta el error?

    Saludos,

    Eric Ruiz

    lunes, 18 de enero de 2021 18:17
    Moderador
  • Hola TheNumberOfTheBeast

    Aunque encontré el error (o uno de ellos, porque podría haber más), tiene razón Eric, facilita mucho la ayuda dar detalles y la linea del error. 

    En tu clase Usuario hay 3 miembros de tipos básicos y los 2 últimos son aparentemente objetos más complejos, que seguramente no fueron instanciados. La solución es, en lugar de crear en el método un objeto TipoUsuario y uno Persona que no se usan en absoluto, asignarle esos objetos a sus correspondientes miembros de la variable user. Más fácil todavía es instanciar esos 2 objetos en su misma declaración en la clase o en su constructor, así después no tenes que estar preocupándote. 

    Lo anterior es un error. Pero me parece, por el mensaje de error que mostraste, que hay otro (porque el anterior sería NullReferenceException), y me suena que podría ser en acceso.leer(). Si todavía en efecto hay errores, ¿podrías mostrar el código de acceso.leer() e indicar la linea del error?

    Saludos

    Pablo

    • Marcado como respuesta EricRRModerator miércoles, 20 de enero de 2021 23:45
    lunes, 18 de enero de 2021 21:27
  • Hola, el problema puede deberse a los tipos de dato de la columna específica del reader. Esto es, que puede que venga algún NULL en algún campo. Ejecuta tu consulta y revisa el conjunto de resultados. También decirte que concatenar la query es mala práctica. Usa consultas parametrizadas como se indica aquí . También revisa si en los campos coincide el tipo esperado. Ejemplo: Id es numérico?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 20 de enero de 2021 18:45
    Moderador
  • Hola Sergio, la consulta no devuelve ningun null y el error lo marca en el id del usuario que no se porque razon siempre lo retorna como 0 (cero). Si comento esa linea del codigo, se resuelve pero no puedo validar el usuario correctamente.

    Alguna ayuda de como puedo hacer que me devuelva el id correcto?

    Gracias

    jueves, 21 de enero de 2021 22:31
  • Hola, ejecutando la consulta directamente en SQL con el Manager Studio te devuelve un único registro? Tal vez el problema sea es
    También prueba a leer así
    reader.GetInt32(reader.GetOrdinal(columnName))
    Comento lo de varios registros ya que parece que estás filtrando por Nombre y no por su identificador


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 21 de enero de 2021 22:53
    Moderador