2010-05-06 6 views
3

Cela me dérange vraiment. Voici un extrait de mon modèle:Problème de date-heure hors de portée utilisant LINQtoSQL

* SQL Server * 

Event 
----- 
Id (int, PK) NOT NULL 
Title (varchar(100)) NULL 
LastModified (datetime) NULL 

EventDates 
---------- 
Id (int, PK) NOT NULL 
StartDate (datetime) NULL 
EndDate (datetime) NULL 

* C# * 

Event 
----- 
public int Id 
public string Title 
public DateTime LastModified 

EventDates 
---------- 
public int Id 
public DateTime StartDate 
public Datetime EndDate 

Le champ LastModified est dans la base de données depuis sa création. Je gardais sa valeur lorsque j'enregistre un événement, mais je veux afficher dans une table, alors j'ai changé mon de la valeur de retour du référentiel d'événements GetEvents:

return (from e in GetDbEvents() 
       select new Event 
       { 
        // Miscellaneous fields.. 
        LastModified = e.LastModified.GetValueOrDefault() // Shiny new code 
       }); 

Quand je l'appelle maintenant, je reçois hurlé:

The conversion of a char data type to a datetime data type 
resulted in an out-of-range datetime value. 

Si je bande sur le code ci-dessus à cela, il ne permet pas encore et je reçois la même erreur, si je tente d'énumérer sur le résultat:

var test = (from e in _db.Events 
        select e.LastModified.GetValueOrDefault()); 

en test, je a fait la même déclaration pour ma table EventDates (encore une fois, avec 2 colonnes datetime):

var test4 = (from ed in _db.EventDates 
        select new EventDate 
        { 
         StartDate = ed.StartDate.GetValueOrDefault(), 
         EndDate = ed.EndDate.GetValueOrDefault() 
        }); 

Cela fonctionne très bien, bien sûr. Pas d'erreur quand j'énumère, toutes les valeurs sont correctes.

Je dois souligner que certaines LastModified valeurs dans le tableau Events sont NULL tandis que toutes les valeurs de EventDates sont remplis avec des données.

Ai-je manqué quelque chose de basique? Merci d'avance!

EDIT Ma principale question est pourquoi Events me donner hors de portée des questions et EventDates ne fonctionne pas, même si le modèle est assez similaire?

+0

Quels sont les minimum et maximum (c.-à-d.MIN() et MAX()) valeurs des dates dans chacune des colonnes de table que vous examinez? –

Répondre

3

Le problème est avec le GetValueOrDefault(). Cela renverra DateTime.MinValue (01-01-0001) dans le cas "par défaut" et sqlserver n'accepte pas cela (il refuse les dates avant environ 1753). Si vous utilisez un Nullable<DateTime>, alors sql sera heureux avec le null qu'il obtiendra.

0

Si vous modifiez la déclaration de votre variable C# LastModified à public DateTime? LastModified qui devrait résoudre votre problème. L'ajout du point d'interrogation indique qu'il s'agit d'un type nullable.

+0

Je vais donner un coup de feu. Ma principale question est, cependant - comment les événements ont-ils ce problème et pas EventDates? Merci! – Dan

1

Peut-être que this est liée?

Une solution possible (si vous ne voulez pas changer LastModified à DateTime?, vous obligeant à litière votre code avec .Value partout ..) serait d'obtenir les valeurs de la base de données en tant que DateTime? « s, mais la traduction les à DateTime dans votre code. Par exemple:

return from e in GetDbEvents() 
     select new Event(e.LastModified); 

... 

//In Event class: 
public Event(DateTime? lastModified) 
{ 
    LastModified = lastModified.GetValueOrDefault(); 
} 

Cela entraînera GetValueOrDefault() d'être appelé côté client, plutôt que de faire partie du SQL.

Notez que cette approche présente problems of its own ...

+0

merci pour les liens! J'aime comment le bug est un 'ne va pas réparer' - ça me donne juste plus de munitions pour mon combat "upgrade to 2008": P – Dan