none
Datetimepicker valor Null RRS feed

  • Pregunta

  • Hola!

    Estoy haciendo una aplicación la cual quiero que almacene un valor null en un campo date(Permite valores Null) cuando se cumple cierta condición, lo estoy tratando de hacer de esta manera:

        If DTPFechaVen.Text = " " Then
            .FechaVen = DBNull.Value
        Else
             .FechaVen = DTPFechaVen.Value
        End If

    Pero al ejecutar me aparece el siguiente error

    Así tengo declarada la variable en una clase 

     Private dateFechaVen As Date
     Public Property FechaVen()
            Get
                FechaVen = dateFechaVen
            End Get
            Set(ByVal Value)
                dateFechaVen = Value
            End Set
        End Property
    Saludos!
    miércoles, 7 de junio de 2017 14:33

Respuestas

  • Te recomiendo configurar en ON la directiva Option Strict, te evidenciará algunas omisiones que vas cometiendo.

    La característica de permitir valores nulos le debes otorgar a la propiedad y al campo de respaldo, cambia a lo siguiente:

    Public dateFechaVen As Date?
    Public Property FechaVen As Date?
    	Get
    		FechaVen = dateFechaVen
    	End Get
    	Set(ByVal Value As Date?)
    		dateFechaVen = Value
    	End Set
    End Property

    Que es lo mismo a (propiedad autoimplementada):

    Property FechaVen As Date?
    

    - Asignación de valores

    .FechaVen = If(DTPFechaVen.Checked, DTPFechaVen.Value, CType(Nothing, DateTime?))

    - Pasar el valor al parámetro

    Dim cmd As New SqlCommand("INSERT INTO Productos(FechaVen) VALUES (@FechaVen)", cn)
    
    cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue,
    				.FechaVen.Value, DirectCast(DBNull.Value, Object)))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Augusto1982 miércoles, 7 de junio de 2017 18:21
    • Marcado como respuesta Federico32113 jueves, 8 de junio de 2017 14:56
    miércoles, 7 de junio de 2017 16:14
  • Primero debes indicar que el tipo Date permita valores Null (basta con definir propiedades auto-implementadas)

    Property FechaVen As Date?

    Sobre el control DateTimePicker puedes configurar la propiedad 'ShowCheckBox' a True para mostrar una casilla de verificación, cuando la casilla no está marcada se entiende que no hay valor seleccionado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 15:04

Todas las respuestas

  • Hola Federico32113

    Un datetimepicker propio de .net (personalizado que quizá se pueda con controles de terceros) no acepta valor null, en todo caso le puedes dar una fecha por defecto, pero null o vacío en el contro, no

    En caso desees que tu porpiedad dateFechaVen almacene null, lo puedes lograr con:

    Private dateFechaVen As Date?
     Public Property FechaVen()
            Get
                FechaVen = dateFechaVen
            End Get
            Set(ByVal Value)
                dateFechaVen = Value
            End Set
        End Property

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.




    miércoles, 7 de junio de 2017 14:42
  • Podrías intentar así en tu clase para que acepte los DbNull

      Private dateFechaVen As Object

    por supuesto faltarían mas validaciones, porque deberías de validar que si se puede castear a date te retorne un date


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.


    miércoles, 7 de junio de 2017 14:50
  • Hice lo que me comentaron declarando "As Object"pero al almacenarse en la base SQL me guarda le fecha mínima "1900-01-01".

    Trato de guardar este valor 

     .FechaVen = " "
    Pero ocurre lo mismo

    miércoles, 7 de junio de 2017 15:02
  • Primero debes indicar que el tipo Date permita valores Null (basta con definir propiedades auto-implementadas)

    Property FechaVen As Date?

    Sobre el control DateTimePicker puedes configurar la propiedad 'ShowCheckBox' a True para mostrar una casilla de verificación, cuando la casilla no está marcada se entiende que no hay valor seleccionado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 15:04
  • Para cerrar la idea, debes validar mediante la propiedad Checked si la casilla está marcada o no, según el estado asignas el valor seleccionado o por el contrario Nothing.

    Dim FechaVen As DateTime? = If(DateTimePicker1.Checked,
    					DateTimePicker1.Value, CType(Nothing, DateTime?))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 15:11
  • Lo manejaste con el ? :  Date? o DateTime? según como lo manejes en tu base de datos

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 7 de junio de 2017 15:22
  • Me quedo así:

    En la clase

    Private dateFechaVen As Date?
     Public Property FechaVen()
            Get
                FechaVen = dateFechaVen
            End Get
            Set(ByVal Value)
                dateFechaVen = Value
            End Set
        End Property

    Así es como almaceno el valor

       If DTPFechaVen.Checked = True Then
         .FechaVen = DTPFechaVen.Value
      Else
         .FechaVen = CType(Nothing, Date?)
       End If

    Pero igual que antes me guarda "1900-01-01" y no el valor vació

    El tipo de dato de la tabla es "Date".

    Modifique a "true" la propiedad "ShowCheckBox"

    Esta es la consulta a la base SQL 

    INSERT INTO Productos (...FechaVen...) VALUES ('')

    miércoles, 7 de junio de 2017 15:52
  • Federico32113

    INSERT INTO Productos (...FechaVen...) VALUES (null)

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 7 de junio de 2017 16:11
  • Te recomiendo configurar en ON la directiva Option Strict, te evidenciará algunas omisiones que vas cometiendo.

    La característica de permitir valores nulos le debes otorgar a la propiedad y al campo de respaldo, cambia a lo siguiente:

    Public dateFechaVen As Date?
    Public Property FechaVen As Date?
    	Get
    		FechaVen = dateFechaVen
    	End Get
    	Set(ByVal Value As Date?)
    		dateFechaVen = Value
    	End Set
    End Property

    Que es lo mismo a (propiedad autoimplementada):

    Property FechaVen As Date?
    

    - Asignación de valores

    .FechaVen = If(DTPFechaVen.Checked, DTPFechaVen.Value, CType(Nothing, DateTime?))

    - Pasar el valor al parámetro

    Dim cmd As New SqlCommand("INSERT INTO Productos(FechaVen) VALUES (@FechaVen)", cn)
    
    cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue,
    				.FechaVen.Value, DirectCast(DBNull.Value, Object)))


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Augusto1982 miércoles, 7 de junio de 2017 18:21
    • Marcado como respuesta Federico32113 jueves, 8 de junio de 2017 14:56
    miércoles, 7 de junio de 2017 16:14

  • Si casteas esto asi .FechaVen = CType(Nothing, Date?), lo va a castear a un tipo date y te pondrá la fecha mínima, pero si lo mandas directo como un object si te inserta el null, yo valido enviar el null cuando la propiedad text tiene este valor "" porque asi lo propusiste al comienzo , como hiciste eso , no lo se ,porque hasta donde se el control datetimepicker del .net no te permite poner valores en blanco .Salvo que uses un control de terceros o haya hecho algo como esto

    Public Class prueba
        Private dateFechaVen As Object
        Public Property FechaVen()
            Get
                FechaVen = dateFechaVen
            End Get
            Set(ByVal Value)
                dateFechaVen = Value
            End Set
        End Property
    End Class
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim prueba1 As New prueba()
            If DTPFechaVen.Text = " " Then
                prueba1.FechaVen = DBNull.Value
                Dim cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cn").ToString)
                cnx.Open()
                Dim cmd As New SqlCommand("insert into fechas(fecha) values (@valor)", cnx)
                cmd.Parameters.AddWithValue("@valor", prueba1.FechaVen)
                cmd.ExecuteNonQuery()
    
            Else
                prueba1.FechaVen = DTPFechaVen.Value
                Dim cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cn").ToString)
                cnx.Open()
    
                Dim cmd As New SqlCommand("insert into fechas(fecha) values (@valor)", cnx)
                cmd.Parameters.AddWithValue("@valor", prueba1.FechaVen)
                cmd.ExecuteNonQuery()
            End If
        End Sub


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala.Solo dejo mis respuestas en el foro si son votadas o respuesta, de lo contrario por mantener el orden las borro.Saludos. Lima-Perú.


    • Editado Augusto1982 sábado, 15 de julio de 2017 3:58
    miércoles, 7 de junio de 2017 16:16
  • me reafirmo en mi comentario anterior, obviamente si casteas esto así .FechaVen = CType(Nothing, Date?), lo va a castear a un tipo date y te pondrá la fecha mínima, pero si lo mandas directo como un object si te inserta el null

    ¿Seguro de tu afirmación?

    Has la siguiente prueba:

    Dim Fecha As Date? = CType(Nothing, DateTime?)
    'Resultado: Nothing

    No hay razón de definir un tipo object porque se puede indicar a los tipos de valor permitir valores Null (o Nothing en VB).


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    miércoles, 7 de junio de 2017 16:23

  • Creo saber donde radica el punto de confusión, el hecho de que conviertas explicitamente a Object la constante DBNull no quiere decir que el tipo de la expresión de la derecha tenga que ser Object, de hecho en la instrucción en c# que has adjuntado puedes cambiar la expresión donde realizas la conversión y verás que dará el mismo resultado. El sentido de convertir a object la clase DBNull tiene que ver porque no se puede resolver una conversión implícita entre DBNull y Date con independencia de que los tipos permitan valores Null.

    [...] Por otro lado el código que posteas funciona , como lo comentas, pero no sirve para castear a null de la base de datos.

    Reitero mi pregunta, ¿seguro de tus afirmaciones?, fíjate:

    cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue,
    				.FechaVen.Value, DirectCast(DBNull.Value, Object)))

    Si la instancia de la clase Struct<DateTime> contiene un valor en el tipo subyacente entonces lo obtenemos mediante la propiedad Value, por el contrario insertamos DBNull

    Finalmente, no resto valor a tu propuesta de hecho imagino que sí funciona, sin embargo pienso que eso se hacía años atrás cuando no existía la característica de permitir valores Null a los tipos de valor, bajo tu propuesta ¿te imaginas como quedaría una clase POCO donde la mayor parte de las propiedades permita null?, todos con el tipo Object y no con el tipo adecuado, reitero, no digo que no funcioné, digo que no es correcto.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 17:00
  • Dí por resuelto que habías revisado los aportes anteriores, en el cuarto aporte indico al OP todo lo que por partes te he venido indicando (uno medio extenso y aburrido que empieza por "...Te recomiendo configurar en ON la directiva Option Strict, te evidenciará ...") y básicamente son dos: 

    - Asignar un valor de fecha o Nothing a la propiedad FechaVen

    - Insertar en una columna de base de datos el valor de la propiedad FechaVen (un valor de fecha o DBNull)


    [...] Tampoco pienso que no se deba declarar tipos que acepten el Nothing, si ve el post del usuario él no refirió un valor Nothing de referencia en ningún momento, su consulta es una comparación contra una cadena vacía no contra una referencia null o Nothing

    De acuerdo, pero eso a todas luces iba a dar error, a menos que el tipo de dato de la columna sea varchar(), de hecho el sentido del foro en cierta medida es ayudar o corregir si así lo quieres ver, de hecho me gusta mucho que me corrigan porque es también una fuente de aprendizaje, como lo fue está platica contigo. Slds.


    miércoles, 7 de junio de 2017 17:40
  • Hice las pruebas mencionadas, me ejecuta la siguiente consulta

    INSERT INTO Productos (... FechaVen, ...) VALUES (..., '', ...)

    Pero al momento de ver como se guardo en la base de datos me carga el valor de la fecha mínima "1900-01-01" . ¿Puede ser que tenga que modificar alguna propiedad del tipo de dato en SQL?

    Para que logren comprender mejor mi caso, es para el registro de un producto el cual no puede tener fecha de vencimiento por lo tanto guardo un valor nulo, el cual en un futuro pueda ser modificado por una fecha determinada. 


    miércoles, 7 de junio de 2017 17:50
  • Ninguna propuesta que se te ha otorgado inserta una cadena de longitud cero como valor para la columna FechaVen. Te sugiero leer detenidamente los aportes realizados y tomar el que consideres oportuno o adjuntar el código que tienes escrito para subrayar los errores que has cometido.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 18:01
  • Hola, 

    Intentaste guardarlo como null?

    En sql:

    insert tabla(fechaVto) values (null)
    En c#:
    Dim fecha As Object 
    fecha = CObj(DBNull.Value) 'cuando quieres que sea null
    cmd.Parameters.AddWithValue("@fechavencimiento", fecha)
    Saludos



    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 7 de junio de 2017 18:02
  • Hola, 

    Intentaste guardarlo como null?

    En sql:

    insert tabla(fechaVto) values (null)
    En c#:
    Dim fecha As Object 
    fecha = CObj(DBNull.Value) 'cuando quieres que sea null
    cmd.Parameters.AddWithValue("@fechavencimiento", fecha)
    Saludos



    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    No, al intentarlo me guarda correctamente el valor "Null"
    miércoles, 7 de junio de 2017 18:07
  • No, al intentarlo me guarda correctamente el valor "Null"

    Te guarda correctamente el null?, no entiendo, quieres guardar null? o quieres guardar un vacío, son cosas distintas.. si quieres guardar un espacio en un campo date es un error, ni date ni datetime aceptan espacios, solo nulls


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 7 de junio de 2017 18:09
  • No, al intentarlo me guarda correctamente el valor "Null"

    Te guarda correctamente el null?, no entiendo, quieres guardar null? o quieres guardar un vacío, son cosas distintas.. si quieres guardar un espacio en un campo date es un error, ni date ni datetime aceptan espacios, solo nulls


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    Estoy intentando guardar Null en el campo Date.

    Como explique en la respuesta anterior, para que si es necesario en un futuro pueda ser reemplazado por una fecha determinada.

    miércoles, 7 de junio de 2017 18:15
  • Puedes compararlo con nothing (que es null en vb) y según la comparativa mandar o el dbnull o el valor que tienes en fecha

    If Fecha Is Nothing Then
       comando.Parameters.AddWithValue("@fechavencimiento", DBNull.Value)
    Else
          comando.Parameters.AddWithValue("@fechavencimiento", Fecha)
    End If

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    miércoles, 7 de junio de 2017 18:57
  • utiliza 

    FechaVen = Nothing
    miércoles, 7 de junio de 2017 19:10
  • Estoy intentando guardar Null en el campo Date. Como explique en la respuesta anterior, para que si es necesario en un futuro pueda ser reemplazado por una fecha determinada.

    Partamos de algo, ¿qué solución de las propuestas has tomado? ¿dónde es que tienes problemas? ¿puedes mostrarnos el código que has escrito?

    La razón del porque tienes una columna marcada con la restricción NOT NULL es irrelevante para el caso, todas las propuestas otorgadas se orientan a resolver el caso que tienes, si tienes problemas adjunta el código y menciona el error.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de junio de 2017 20:37
  • Estoy intentando guardar Null en el campo Date. Como explique en la respuesta anterior, para que si es necesario en un futuro pueda ser reemplazado por una fecha determinada.

    Partamos de algo, ¿qué solución de las propuestas has tomado? ¿dónde es que tienes problemas? ¿puedes mostrarnos el código que has escrito?

    La razón del porque tienes una columna marcada con la restricción NOT NULL es irrelevante para el caso, todas las propuestas otorgadas se orientan a resolver el caso que tienes, si tienes problemas adjunta el código y menciona el error.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Te adjunto el código que uso para hacerlo:

    También intente

                           

     If DTPFechaVen.Checked = True Then

    .FechaVen = DTPFechaVen.Value Else .FechaVen = DirectCast(DBNull.Value, Object) End If .Insertar()

    Private dateFechaVen As Object
     Public Property FechaVen()
            Get
                FechaVen = dateFechaVen
            End Get
            Set(ByVal Value)
                dateFechaVen = Value
            End Set
        End Property

    Así me queda la consulta durante la ejecución:

    INSERT INTO Productos (Id_producto, Nombre, PrecioCosto, PrecioVenta, CantidadStock, Observacion, Proveedor, Codigo, Categoria, FechaVen, DiaVen) VALUES (2, 'asd', '22', '2', '2', '', '', '', '', '', '')

    Declarando la variable así tampoco funciona

    Public dateFechaVen As Date?
    Public Property FechaVen As Date?
    	Get
    		FechaVen = dateFechaVen
    	End Get
    	Set(ByVal Value As Date?)
    		dateFechaVen = Value
    	End Set
    End Property

    En la la base de datos FechaVen es del tipo "date"

    No me surge ningún error pero me guarda la siguiente fecha "1900-01-01" y no el valor null.



    jueves, 8 de junio de 2017 3:20
  • Parametriza la consulta:

    cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue,
    				.FechaVen.Value, DirectCast(DBNull.Value, Object)))

    En comentarios anteriores se deja un ejemplo.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 8 de junio de 2017 3:44
  • Parametriza la consulta:

    cmd.Parameters.AddWithValue("@FechaVen", If(.FechaVen.HasValue,
    				.FechaVen.Value, DirectCast(DBNull.Value, Object)))

    En comentarios anteriores se deja un ejemplo.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Así quedo:

      If DTPFechaVen.Checked = True Then
    
                            .FechaVen = DTPFechaVen.Value
                        Else
                            .FechaVen = If(.FechaVen.HasValue,
        .FechaVen.Value, DirectCast(DBNull.Value, Object))
                        End If
    

    Me aparece el siguiente mensaje de error

    "La conversión especificada no es valida"

    jueves, 8 de junio de 2017 3:52