Principales respuestas
Ayuda con C#

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!
- Editado Sergio ParraModerator martes, 19 de enero de 2021 17:59 formatear código fuente
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
-
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
- Editado Sergio ParraModerator miércoles, 20 de enero de 2021 18:46
- Marcado como respuesta EricRRModerator miércoles, 20 de enero de 2021 23:45
Todas las 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
-
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
- Editado Sergio ParraModerator miércoles, 20 de enero de 2021 18:46
- Marcado como respuesta EricRRModerator miércoles, 20 de enero de 2021 23:45
-
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
-
Hola, ejecutando la consulta directamente en SQL con el Manager Studio te devuelve un único registro? Tal vez el problema sea esTambié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
- Editado Sergio ParraModerator jueves, 21 de enero de 2021 22:54