使用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
没有,即使模型颇为相似?
的问题是与GetValueOrDefault()。这将在“默认”情况下返回DateTime.MinValue
(01-01-0001),并且sqlserver不接受(它在1753之前拒绝日期)。
如果你使用的是Nullable<DateTime>
,那么sql会很满意它会得到的null
。
如果将您的C#变量LastModified的声明更改为public DateTime? LastModified
,那么应该修复您的问题。问号的添加表明它是可以为空的类型。
我会给你一个镜头。然而,我的主要问题是 - 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 ...
感谢您的链接!我喜欢这个错误是一个'无法修复' - 它为我的“升级到2008年”战斗提供了更多的弹药:P – Dan 2010-05-06 14:53:08
什么是最小值和最大值(即MIN()和MAX())值的每个表格列中你正在检查? – 2010-05-06 14:40:02