我有一个为2008年写的应用程序。
我们正在使用linq实体。
我们现在必须将数据库切换到2005.我在linq SELECT查询中收到以下错误:
错误 - SqlDateTime溢出。必须在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。
违规行是:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
DateTime.MinValue : s.Date_Of_Birth.Value,
DateOfBirth的类型为DateTime,属于我们自己的业务对象(非实体)中的属性。
任何人都知道如何修改此行以使此查询运行?
答案 0 :(得分:14)
确保lowdate
至少为1/1/1753。
如果您尝试提供之前的日期,EF会将其转换,并将其传递给您的查询。此外,您不需要在查询中使用DateTime.MinValue
,而是您的min:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
new DateTime(1753,1,1) : s.Date_Of_Birth.Value;
请记住,使用EF,查询会在服务器上编译并转换为SQL,因此这些值也必须适合。
话虽这么说,我个人更喜欢将DateOfBirth
存储为DateTime?
(可空类型),而不是使用“魔术值”(DateTime.MinValue
)来保存数据库null或不合适值。
答案 1 :(得分:7)
另外,为了在这里添加好的答案,请尝试使用SqlDateTime.MinValue而不是1/1/1973或DateTime.MinValue。
http://msdn.microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.minvalue.aspx
当然,它与1973年1月1日的情况相同,但它更清洁,更不那么神奇。
答案 2 :(得分:4)
请尝试使用(DateTime)SqlDateTime.MinValue
:
DateOfBirth = ((s.Date_Of_Birth == null) || (s.Date_Of_Birth <= lowdate)) ?
(DateTime)SqlDateTime.MinValue : s.Date_Of_Birth.Value,
您需要包含:
using System.Data.SqlTypes;
如果您仍想使用非空日期字段,那将解决此问题。但是,正如其他人提到的那样,最好使用空日期字段。
答案 3 :(得分:3)
DateTime.MinValue
相当于00:00:00.0000000, January 1, 0001
。
SQL 2005中的DateTime是在1/1/1753 12:00:00 AM和12/31/9999 11:59:59 P
之间您应该创建一个
,而不是使用DateTime.MinValuepublic static DateTime DateTimeMinValueInSQL2005 = new DateTime(1753,1,1);
并使用它代替DateTime.MinValue;
答案 4 :(得分:1)
当您尝试将DateTime.MinValue持久化到SQL DateTime字段时,通常会发生这种情况
答案 5 :(得分:1)
当然,将DateTime.MinValue替换为“1/1/1753 12:00:00 AM”
答案 6 :(得分:1)
我为此创建了一个扩展函数:
/// <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;
}
答案 7 :(得分:0)
我通过添加以下代码解决了这个问题。
DateTime FromDate = dtpFromDate.Value;
DateTime ToDate =dtpToDate.Value;