none
validar dato nulo en tipo long? RRS feed

  • Pregunta

  • Buenas tardes a todos, estoy tratando de hacer una validación porque tengo varios datos que me están llegando nulos  porque esos valores quedaron mal cuando los insertaron y trato de validar de la siguiente forma ya que no puedo modificar el tipo de dato:

    long id = entidad.id.Value == null  ? 0 : entidad.id.Value,

    Pero me sale un mensaje sin compilar, "el resultado de expression siempre es 'false' dado que un valor de tipo long? nunca es igual a NULL"; pero eso no es cierto porque el dato en la bd está null.

    Gracias.

    miércoles, 6 de enero de 2021 21:17

Respuestas

  • Si el dato entidad.id es del tipo long?, entonces la forma de validar si es null es esta:

    long id = entidad.id.HasValue ? entidad.id.Value : 0;

    Es decir, HasValue te devuelve un booleano que indica si tiene valor o no.

    Pero ojo, esto depende de que el mecanismo que lee desde la base de datos traduzca correctamente el NULL de la base de datos en un null de C#. Esto no es evidente ni seguro; hay que hacerlo bien. Cuando usas ADO.NET, lo que recibe desde la base de datos es un DBNull.Value, y esto es un objeto que no es null. El código tiene que traducir DbNull.Value en null. Normalmente esto se suele hacer, pero no puede darse por sentado. Solo ocurrirá si el mecanismo usado para leer la BD lo tiene implementado.

    EDITADO: Y para aclarar un poco más las cosas, cuando llamas a entidad.id.Value, el .Value lo que hace es extraer un long de dentro del long?. Y el long (sin ?) es un tipo-valor (no un tipo-referencia), por lo que nunca puede ser null.
    miércoles, 6 de enero de 2021 21:42
    Moderador

Todas las respuestas

  • Si el dato entidad.id es del tipo long?, entonces la forma de validar si es null es esta:

    long id = entidad.id.HasValue ? entidad.id.Value : 0;

    Es decir, HasValue te devuelve un booleano que indica si tiene valor o no.

    Pero ojo, esto depende de que el mecanismo que lee desde la base de datos traduzca correctamente el NULL de la base de datos en un null de C#. Esto no es evidente ni seguro; hay que hacerlo bien. Cuando usas ADO.NET, lo que recibe desde la base de datos es un DBNull.Value, y esto es un objeto que no es null. El código tiene que traducir DbNull.Value en null. Normalmente esto se suele hacer, pero no puede darse por sentado. Solo ocurrirá si el mecanismo usado para leer la BD lo tiene implementado.

    EDITADO: Y para aclarar un poco más las cosas, cuando llamas a entidad.id.Value, el .Value lo que hace es extraer un long de dentro del long?. Y el long (sin ?) es un tipo-valor (no un tipo-referencia), por lo que nunca puede ser null.
    miércoles, 6 de enero de 2021 21:42
    Moderador
  • Hola Alberto, muchas gracias por la ayuda y la explicación; ya me funciona la validación con tu ajuste.

    saludos,

    miércoles, 6 de enero de 2021 22:11
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    miércoles, 6 de enero de 2021 23:42
    Moderador