none
Problema al intentar guardar un NULL en DateTime en sql server RRS feed

  • Pregunta

  • Buenas
    Queria hacer una consulta ya que hice varias pruebas y no estoy pudiendo realizar
    Al hacer un alta tengo un campo DateTime que pueden ingresarlo como dejarlo vacio

    Lo primero que hago es un Validating para ver que si ingreso una fecha sea correcta, si no ingreso nada no hago la verificacion ya que puede estar vacio, con esto no tengo problema

    private void maskedTextBoxFechaAlta_Validating(object sender, CancelEventArgs e)
            {
                if (!String.IsNullOrEmpty (maskedTextBoxFechaAlta.Text))
                {
                    DateTime fechaAlta;
                    if (!DateTime.TryParse(maskedTextBoxFechaAlta.Text, out fechaAlta))
                    {
                        errorProviderAgregarSocio.SetError(maskedTextBoxFechaAlta, "Debe ingresar una fecha de alta valida");
                        e.Cancel = true;
                    }
                }
            }

    El problema que tengo es al tratar de verificar si debo insertar el dato que diferencia entre el DateTime o Null

    dAOSocio.AgregarSocio
                        (                     DateTime.TryParse(maskedTextBoxFechaAlta.Text, out fechaAlta) ? fechaAlta : (DateTime?)null
                        );
    
    
    Lo que recibe por parametro es (borre todos los parametros de mas que no sirven para el caso)

    public void AgregarSocio(DateTime ?fechaAlta)
    new SqlParameter("@FechaAlta", fechaAlta),
    El problema que tengo aca es que cuando recibe la fecha lo hace bien, pero cuando recibe null tiene problemas al insertarlo en la base, por lo que vi debo utilizar DBNull.Value

    Entonces probe con (el true solo lo puse para probar el then y else)

    new SqlParameter("@FechaAlta", true ? (DateTime?)DBNull.Value : fechaAlta),

    Con esto tengo el siguiene error No se puede convertir el tipo 'System.DBNull' en 'System.DateTime? no se si la estoy complicando mucho y hay algo mas facil para hacer esto, ya que es solo ingresar un dateTime si es valido y si no un null

    Muchas gracias

    Saludos!




    lunes, 16 de noviembre de 2020 2:09

Respuestas

  • Estuve leyendo unos foros en ingles
    Y convirtiendo el DBNull.Value en object me funciono

    new SqlParameter("@FechaAlta", fechaAlta==null ? (object)DBNull.Value : fechaAlta),

    Sigo sin entender igual porque de la manera anterior no funcionaba, teniendo en cuenta que no estaba tratando de realizar ninguna conversion, ambos parametros individualmente me funcionaban bien, pero cuando le ponia la condicion para que elija uno u otro me tiraba error, pero bueno, ahi funciono

    Muchas gracias por la ayuda
    lunes, 16 de noviembre de 2020 4:22

Todas las respuestas

  • Hola Alejandro

    No se puede convertir o comparar el tipo DateTime con null o con DBNull desde el lado del lenguaje C#, pero si podes comparar o igualar un campo de una tabla de una BD con NULL en el lado del lenguaje T-SQL. 

    O sea, lo que podes hacer es definir una fecha que no exista (como 1-1-1900) para usarla como "nulo" desde el lado de C#, y cuando insertas o modificas en la BD, usar el valor NULL de T-SQL.

    Por ejemplo (ilustrativo): 

    if (valorDate.ToShortDateString() == "1-1-1900")

        ordenSQL = "INSERT INTO Tabla VALUES ('Juan', 'Pérez', NULL)";

    Esto suponiendo que el 3er campo de Tabla acepta valores NULL (y se supone que sería de tipo DATETIME).

    Saludos

    Pablo

    lunes, 16 de noviembre de 2020 2:31
  • En la pregunta que planteaste el otro dia, sobre "como tratar datos null..." te dejé una clase que soluciona ese problema. Pero si haces una pregunta y después no lees lo que te contestan, será difícil que le saques provecho a este magnifico foro.

    saludos


    • Editado AntiWork lunes, 16 de noviembre de 2020 2:45
    lunes, 16 de noviembre de 2020 2:44
  • Hola Alejandro

    No se puede convertir o comparar el tipo DateTime con null o con DBNull desde el lado del lenguaje C#, pero si podes comparar o igualar un campo de una tabla de una BD con NULL en el lado del lenguaje T-SQL. 

    O sea, lo que podes hacer es definir una fecha que no exista (como 1-1-1900) para usarla como "nulo" desde el lado de C#, y cuando insertas o modificas en la BD, usar el valor NULL de T-SQL.

    Por ejemplo (ilustrativo): 

    if (valorDate.ToShortDateString() == "1-1-1900")

        ordenSQL = "INSERT INTO Tabla VALUES ('Juan', 'Pérez', NULL)";

    Esto suponiendo que el 3er campo de Tabla acepta valores NULL (y se supone que sería de tipo DATETIME).

    Saludos

    Pablo


    Si entiendo eso
    Lo que no entiendo es lo siguiente
    El IF Ternario me toma bien la condicion

    Si yo hago
    Funciona
    new SqlParameter("@FechaAlta", DBNull.Value)
    Funciona
    new SqlParameter("@FechaAlta", fechaAlta)

    Pero si yo hago que dependiendo la condicion haga una u otra no

    new SqlParameter("@FechaAlta", true ? DBNull.Value : fechaAlta)
    No quiero hacer ninguna conversion en este caso




    lunes, 16 de noviembre de 2020 3:47
  • En la pregunta que planteaste el otro dia, sobre "como tratar datos null..." te dejé una clase que soluciona ese problema. Pero si haces una pregunta y después no lees lo que te contestan, será difícil que le saques provecho a este magnifico foro.

    saludos


    Buenas AntiWork, no te enojes, claro que lei la respuesta, de hecho pense que lo habia podido solucionar al ver que me dejo enviar por parametro null, asi que segui con otra cosa, y cuando volvi con esto me di cuenta que no me deja insertar null en la base, si no que debo utilizar BDNull.Value, me llama la atencion como comente arriba que me deje enviar el DateTime y el DBNull.Value, pero cuando le pongo una comparacion para que envie uno u otro me marque error de conversion cuando no quiero convertir nada
    Y por lo de la respuesta anterior muchas gracias, pero estaba viendo habia alguna manera de resolverlo con menos codigo, se que podria resolverlo tambien si esta vacio enviar un MinValue del datetime y en el StoreProcedure comparar con esa fecha y si es asi insertar null, pero como en este foro hay gente que sabe mucho me gusta consultar ya que muchas veces me han dado respuestas para resolver problemas de manera muy sencilla a la que generalmente utilizo

    Muchas gracias

    Saludos!
    lunes, 16 de noviembre de 2020 3:54
  • Estuve leyendo unos foros en ingles
    Y convirtiendo el DBNull.Value en object me funciono

    new SqlParameter("@FechaAlta", fechaAlta==null ? (object)DBNull.Value : fechaAlta),

    Sigo sin entender igual porque de la manera anterior no funcionaba, teniendo en cuenta que no estaba tratando de realizar ninguna conversion, ambos parametros individualmente me funcionaban bien, pero cuando le ponia la condicion para que elija uno u otro me tiraba error, pero bueno, ahi funciono

    Muchas gracias por la ayuda
    lunes, 16 de noviembre de 2020 4:22
  • Que raro, yo lo probé recién y funcionó.

    Seguro que el campo fechaAlta está marcado como Allow Nulls?

    lunes, 16 de noviembre de 2020 11:45
  • Hola Antiwork, 

    Entonces la solución te funcionó?

    Saludos

    --------------------------------------------------------------------------------

    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 sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

     

    miércoles, 18 de noviembre de 2020 17:18
    Moderador
  • Hola Antiwork, 

    Entonces la solución te funcionó?

    Saludos

    --------------------------------------------------------------------------------

    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 sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

     

    No, Me equivoqué, Es como dice AlejandroRicotti, Hay que castear a Object.
    sábado, 21 de noviembre de 2020 11:11