2010-08-03 10 views
9

J'ai une application écrite pour 2008.Erreur - Dépassement SqlDateTime. Doit être entre 1/1/1753 12:00:00 AM et 31/12/9999 11:59:59 PM

Nous utilisons linq pour les entités.

Nous avons eu maintenant passer la DB à 2005. Je reçois l'erreur suivante sur LINQ requêtes SELECT:

Erreur - débordement SqlDateTime. Doit être compris entre 1/1/1753 12:00:00 AM et 31/12/9999 23:59:59.

La ligne incriminée est:

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

DateOfBirth est de type DateTime et une propriété dans notre propre objet métier (non entité).

Quelqu'un sait comment je peux modifier cette ligne pour que cette requête s'exécute?

+0

Qu'est-ce que est réglé "lowdate" à? –

+0

avez-vous mis le profileur sql sur lui pour voir ce que le SQL réel est en cours d'exécution? – BlackICE

Répondre

1

Cela arrive souvent lorsque vous essayez de persister DateTime.MinValue à un champ DateTime SQL

+1

Je le pensais aussi, mais il va chercher, pas en train d'économiser. –

+0

@Kirk Woll: il récupère l'heure (parce que les dates sont postérieures à l'année 1753) mais peut stocker une valeur si petite dans DataTime.MinValue; –

13

Assurez-vous que lowdate est au moins 01.01.1753.

Si vous essayez de fournir une date antérieure, EF la convertira et la transmettra à votre requête. De plus, vous avez besoin de ne pas utiliser DateTime.MinValue dans la requête, mais quelle serait votre min:

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

Rappelez-vous, avec EF, la requête est compilée et converti en SQL sur le serveur, de sorte que les valeurs doivent tous être approprié là aussi.

Cela dit, je préfère personnellement stocker DateOfBirth comme DateTime? (type Nullable) au lieu d'utiliser une « valeur magique » (DateTime.MinValue) à la base de données contiennent des valeurs nulles ou inappropriées.

+1

+1 pour l'utilisation d'un type Nullable. –

1

Bien sûr, remplacer DateTime.MinValue avec "01/01/1753 12:00:00 AM"

3

Le DateTime.MinValue est équivalent à 00:00:00.0000000, January 1, 0001.

Et le DateTime dans SQL 2005 est entre 01/01/1753 12:00:00 AM et 12/31/9999 11:59:59 P

Au lieu d'utiliser DateTime.MinValue, vous devez créer un

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

et de l'utiliser plutôt DateTime.MinValue;

3

Essayez d'utiliser (DateTime)SqlDateTime.MinValue à la place:

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

Vous devrez inclure:

using System.Data.SqlTypes; 

qui prendra soin de la question si vous voulez continuer à utiliser un champ de date non nulle. Cependant, comme d'autres l'ont mentionné, il peut être préférable d'utiliser un champ de date nulle.

1

J'ai créé une fonction d'extension pour cela:

/// <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; 
    } 
Questions connexes