2010-08-03 152 views
9

tengo una aplicación escrita para 2008.Error: desbordamiento de SqlDateTime. Debe estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM

Estamos utilizando linq para las entidades.

Ahora he tenido que cambiar la base de datos para 2005. Estoy recibiendo el siguiente error en LINQ consultas de selección:

Error - SqlDateTime desbordamiento. Debe estar entre 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 PM.

La línea en cuestión es:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    DateTime.MinValue : s.Date_Of_Birth.Value, 

DateOfBirth es de tipo DateTime y una propiedad en nuestro propio objeto de negocio (no la entidad).

¿Alguien sabe cómo puedo modificar esta línea para hacer que esta consulta se ejecute?

+0

¿Qué es "lowdate" ajustado a? –

+0

, ¿ha establecido el perfilador sql para ver qué es el SQL real que se está ejecutando? – BlackICE

Respuesta

1

Esto sucede a menudo cuando intenta persistir DateTime.MinValue a un campo DateTime de SQL

+1

Pensé lo mismo, pero él está buscando, no guardando. –

+0

@Kirk Woll: está obteniendo tiempo (porque las fechas son posteriores al año 1753) pero puede almacenar un valor tan pequeño como en DataTime.MinValue; –

13

Asegúrese de que lowdate es al menos 1/1/1753.

Si intenta proporcionar una fecha anterior, EF la convertirá y la pasará a su consulta. Además, es necesario no utilizar DateTime.MinValue en la consulta, sino más bien lo que sería su min:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    new DateTime(1753,1,1) : s.Date_Of_Birth.Value; 

Recuerde que con EF, la consulta se compila y se convierte en SQL en el servidor, por lo que los valores deben todos ser apropiado allí, también.

Dicho esto, yo personalmente preferiría para almacenar DateOfBirth como DateTime? (tipo anulable) en lugar de utilizar un "valor mágico" (DateTime.MinValue) para contener valores nulos o inapropiados base de datos.

+1

+1 para usar un tipo que admite nulos. –

1

Claro, reemplace DateTime.MinValue con "1/1/1753 12:00:00 AM"

3

El DateTime.MinValue es equivalente a 00:00:00.0000000, January 1, 0001.

Y el DateTime en SQL 2005 es entre el 1/1/1753 12:00:00 AM y 12/31/9999 11:59:59 P

En lugar de utilizar DateTime.MinValue, se debe crear una

public static DateTime DateTimeMinValueInSQL2005 = new DateTime(1753,1,1); 

y úsela en cambio DateTime.MinValue;

3

Intente utilizar (DateTime)SqlDateTime.MinValue lugar:

DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ? 
    (DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value, 

Usted tendrá que incluir:

using System.Data.SqlTypes; 

que se hará cargo del problema si aún desea utilizar un campo de fecha que no sea nulo. Sin embargo, como han mencionado otros, puede ser mejor ir con un campo de fecha nula.

1

He creado una función de extensión para esto:

/// <summary> 
/// Will return null if the CLR datetime will not fit in an SQL datetime 
/// </summary> 
/// <param name="datetime"></param> 
/// <returns></returns> 
    public static DateTime? EnsureSQLSafe(this DateTime? datetime) 
    { 
     if (datetime.HasValue && (datetime.Value < (DateTime)SqlDateTime.MinValue || datetime.Value > (DateTime)SqlDateTime.MaxValue)) 
      return null; 

     return datetime; 
    } 
Cuestiones relacionadas