2010-08-03 10 views
9

Ho un'app scritta per il 2008.- Overflow SqlDateTime. Deve essere tra 1/1/1753 12:00 AM e 31/12/9999 11:59:59 PM

Stiamo usando linq per le entità.

ora abbiamo dovuto cambiare il DB al 2005. Sto ottenendo il seguente errore su LINQ query di selezione:

Errore - SqlDateTime troppo pieno. Deve essere compreso tra 1/1/1753 12:00:00 e 31/12/9999 11:59:59 PM.

La linea incriminata è:

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

DateOfBirth è di tipo DateTime e una proprietà nel nostro oggetto di business (non entità).

Qualcuno sa come posso modificare questa riga per eseguire questa query?

+0

cosa è "lowdate" impostato su? –

+0

hai impostato sql profiler su di esso per vedere quale è l'SQL reale che è in esecuzione? – BlackICE

risposta

1

Questo spesso accade quando si tenta di persistere DateTime.MinValue a un campo di SQL DateTime

+1

L'ho pensato anch'io, ma sta cercando, non salvando. –

+0

@ Kirk Woll: sta recuperando il tempo (perché le date sono successive all'anno 1753) ma è possibile memorizzare un valore così piccolo come in DataTime.MinValue; –

13

Assicurarsi che lowdate è almeno 1753/01/01.

Se si tenta di fornire una data prima, EF lo convertirà e lo passerà alla query. Inoltre, è necessario non utilizzare DateTime.MinValue nella query, ma piuttosto che cosa sarebbe la vostra min:

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

Ricordate, con EF, la query viene compilato e convertito a SQL sul server, in modo che i valori devono tutto essere appropriato anche lì.

Detto questo, io personalmente preferisco memorizzare DateOfBirth come DateTime? (tipo nullable) invece di utilizzare un "valore magico" (DateTime.MinValue) per contenere database di valori nulli o inappropriati.

+1

+1 per l'utilizzo di un tipo nullable. –

1

Certo, sostituire DateTime.MinValue con "1753/01/01 12:00:00"

3

Il DateTime.MinValue è equivalente a 00:00:00.0000000, January 1, 0001.

E il DateTime in SQL 2005 è tra 1753/01/01 12:00:00 e 12/31/9999 11:59:59 P

Invece di usare DateTime.MinValue, si dovrebbe creare un

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

e usarlo invece DateTime.MinValue;

3

Provare a utilizzare (DateTime)SqlDateTime.MinValue invece:

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

Sarà necessario includere:

using System.Data.SqlTypes; 

che si prenderà cura del problema se si vuole ancora utilizzare un campo data non nullo. Tuttavia, come altri hanno menzionato, potrebbe essere meglio andare con un campo di data nullo.

1

ho creato una funzione di estensione per questo:

/// <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; 
    } 
Problemi correlati