Principales respuestas
Problema al intentar guardar un NULL en DateTime en sql server

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)
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
new SqlParameter("@FechaAlta", fechaAlta),
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!
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- Marcado como respuesta Sergio ParraModerator sábado, 21 de noviembre de 2020 15:02
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
-
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
-
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
-
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
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! -
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- Marcado como respuesta Sergio ParraModerator sábado, 21 de noviembre de 2020 15:02
-
-
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.
-
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.