parsear - read datetime c#
DateTime.MinValue y SqlDateTime overflow (9)
No quiero validar txtBirthDate
así que quiero pasar DateTime.MinValue
en la base de datos.
Mi código:
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = DateTime.MinValue;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
DateTime.MinValue
return Date = {1/1/0001 12:00:00 AM}
Tengo un error de SQL:
SqlDateTime desbordamiento. Debe estar entre el 1/1/1753 12:00:00 AM y el 12/31/9999 11:59:59 PM.
Lo entiendo pero no entiendo por qué DateTime.MinValue
devuelve una fecha no válida que no se puede insertar en la base de datos. ¿Cómo manejar este tipo de situación?
Esto es lo que puedes hacer. Aunque hay muchas maneras de lograrlo.
DateTime? d = null;
if (txtBirthDate.Text == string.Empty)
objinfo.BirthDate = d;
else
objinfo.BirthDate = DateTime.Parse(txtBirthDate.Text);
Nota: Esto funcionará solo si la columna de fecha y hora de su base de datos es Permitir nulo. De lo contrario, puede definir un valor mínimo estándar para DateTime d.
Aunque es una pregunta antigua, otra solución es usar datetime2 para la columna de la base de datos. Enlace MSDN
Básicamente, no use DateTime.MinValue
para representar un valor faltante. No puede usar DateTime.MinValue
en un campo de DateTime de SQL Server, ya que SQL Server tiene un valor mínimo de inicio de 1753.
En su lugar, convierta su propiedad BirthDate
en Nullable<DateTime>
(también conocida como DateTime?
), Y Nullable<DateTime>
en null
cuando no tenga un valor. También asegúrese de que el campo de su base de datos sea anulable. Luego, solo debe asegurarse de que ese null
termine como un valor NULL
en la base de datos. Exactamente cómo lo hará dependerá de su acceso a los datos, del cual no nos ha dicho nada.
Bueno ... es bastante simple obtener una fecha mínima de SQL
DateTime sqlMinDateAsNetDateTime = System.Data.SqlTypes.SqlDateTime.MinValue
Desde MSDN:
Datos de fecha y hora desde el 1 de enero de 1753 hasta el 31 de diciembre de 9999, con una precisión de un centésimo de segundo o 3,33 milisegundos. Los valores se redondean a incrementos de .000, .003 o .007 milisegundos. Se almacena como dos enteros de 4 bytes. Los primeros 4 bytes almacenan el número de días antes o después de la fecha base, 1 de enero de 1900. La fecha base es la fecha de referencia del sistema. Los valores de fecha y hora anteriores al 1 de enero de 1753 no están permitidos. Los otros 4 bytes almacenan la hora del día representada como el número de milisegundos después de la medianoche. Los segundos tienen un rango válido de 0–59.
SQL usa un sistema diferente de C # para los valores de DateTime.
Puede usar MinValue como valor de centinela, y si es MinValue, pase el valor nulo a su objeto (y almacene la fecha como anulable en la base de datos).
if(date == dateTime.Minvalue)
objinfo.BirthDate = null;
En pocas palabras, no utilice DateTime.MinVaue
como valor predeterminado.
Hay un par de MinValues
diferentes por ahí, dependiendo del entorno en el que se encuentre.
Una vez tuve un proyecto, donde estaba implementando un proyecto de Windows CE, estaba usando DateTime.MinValue
(año 0001) del MinValue
, la base de datos MinValue
(1753) y un DateTimePicker
control de UI (creo que era 1970). Así que hubo al menos 3 valores de MinValues ​​diferentes que conducían a un comportamiento extraño y resultados inesperados. (Y creo que incluso hubo una cuarta versión (!), Simplemente no recuerdo de dónde vino).
Use un campo de base de datos anulable y cambie su valor en un Nullable<DateTime>
lugar. Donde no haya un valor válido en su código, tampoco debería haber un valor en la base de datos. :-)
Estoy usando esta función para tryparse
public static bool TryParseSqlDateTime(string someval, DateTimeFormatInfo dateTimeFormats, out DateTime tryDate)
{
bool valid = false;
tryDate = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
System.Data.SqlTypes.SqlDateTime sdt;
if (DateTime.TryParse(someval, dateTimeFormats, DateTimeStyles.None, out tryDate))
{
try
{
sdt = new System.Data.SqlTypes.SqlDateTime(tryDate);
valid = true;
}
catch (System.Data.SqlTypes.SqlTypeException ex)
{
}
}
return valid;
}
Muy simple, evite usar DateTime.MinValue
use System.Data.SqlTypes.SqlDateTime.MinValue
lugar.
usar extensiones
public static class DateTimeExtensions
{
public static DateTime MinValue(this DateTime sqlDateTime)
{
return new DateTime(1900, 01, 01, 00, 00, 00);
}
}
DateTime date = DateTime.Now;
Console.WriteLine("Minvalue is {0} ", date.MinValue().ToShortDateString());