使用LINQtoSQL超出范围日期时间问题

问题描述:

这真让我困惑。这里是我的模型的一个片段:使用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 

LastModified领域一直处于自其创建数据库。我一直保存它的值当我保存的事件,但我想在一个表中显示它,所以我改变了我的事件库的GetEvents的返回值:

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

现在当我打电话,我得到在大叫:

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

如果我剥离下来,上面的代码这一点,但它仍然没有帮助,我也得到了同样的错误,如果我试图枚举结果:

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

作为测试,我做同样的语句我EventDates表(再次,与2 datetime列):

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

这工作得很好,当然。列举时没有错误,所有的值都是正确的。

我应该指出Events表中的一些LastModified值是NULL,而EventDates中的所有值都填充了数据。

我错过了一些基本的东西吗?提前致谢!

编辑 我的主要问题是为什么Events给我超出范围的问题,EventDates没有,即使模型颇为相似?

+0

什么是最小值和最大值(即MIN()和MAX())值的每个表格列中你正在检查? – 2010-05-06 14:40:02

的问题是与GetValueOrDefault()。这将在“默认”情况下返回DateTime.MinValue(01-01-0001),并且sqlserver不接受(它在1753之前拒绝日期)。

如果你使用的是Nullable<DateTime>,那么sql会很满意它会得到的null

如果将您的C#变量LastModified的声明更改为public DateTime? LastModified,那么应该修复您的问题。问号的添加表明它是可以为空的类型。

+0

我会给你一个镜头。然而,我的主要问题是 - Events如何解决这个问题,而不是EventDates?谢谢! – Dan 2010-05-06 14:18:46

也许this是相关的?

一个可能的修复(如果你不想上次更改时间更改为DateTime?,需要你垃圾你的代码.Value无处不在..)将获得从数据库中值DateTime?的,但翻译他们到DateTime在你的代码中。例如:

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

... 

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

这将导致GetValueOrDefault()被称为客户端,而不是在SQL的一部分。

注意,这种方法确实有problems of its own ...

+0

感谢您的链接!我喜欢这个错误是一个'无法修复' - 它为我的“升级到2008年”战斗提供了更多的弹药:P – Dan 2010-05-06 14:53:08