2012-02-21 96 views
0

我将一些小型XML文件解析到EF对象中,然后将它们加载到SQL Server 2008数据库中。EF更新异常:将datetim2数据类型转换为日期时间

表定义:

CREATE TABLE [dbo].[Events](
    [ID] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL, 
    [EventDate] datetime NULL 
) 

XML:

<root> 
    <event date="2012-02-16T13:14:53" /> 
    <event date="2012-02-16T13:14:53" /> 
    <event date="2012-02-15T18:48:32" /> 
<root> 

解析XML:

var events = XDocument.Load(xmlStream) 
    .Descendants("event") 
    .Select(x => new Event 
    { 
     EventDate = (DateTime?)x.Attribute("date") 
    }); 

推到DB:

foreach(var event in events) 
{ 
    dbContext.Events.Add(event); 
} 
dbContext.SaveChanges(); 

而且我得到以下错误:

System.Data.SqlClient.SqlException: The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value. 

我周围中搜索并尝试了所有的以下无济于事的:

  • 从“2008”更改EDMX“ProviderManifestToken”到“2005年“
  • 更改 'StoreGeneratedPattern' 到 ”计算“
  • 改变LINQ到XML表达

似乎没有任何工作...跑离开这里的想法...

+0

类似演员的声音失败。虽然它看起来像一个标准格式,但请确认您已获得正确投放的日期。否则,请使用'if(DateTime.TryParse(..)){EventDate = parsedDate; } else {EventDate = null; }' – 2012-02-21 21:42:37

+1

你有调试吗?当您尝试将其添加到上下文时,“EventDate”的值是多少? – 2012-02-21 21:55:43

回答

0

如果我从解析XML字符串日期时间,我会尝试使用DateTime.Parse

它看起来像你的日期时间能可以通过简单的String.replace进行解析。

我认为有一个解析函数,你可以传递一个格式化字符串(像"yyyy-MM-ddThh:mm:ss"),但我似乎无法找到现在的文档。

+0

刚刚尝试过,仍然错误仍然存​​在 – Didaxis 2012-02-21 22:01:56

+0

@ErOx我实际上没有发布代码示例。你究竟做了什么? – 2012-02-21 22:07:04

0

正如所述,尝试直接解析日期。

EventDate = DateTime.ParseExact(x.Attribute("date"), "yyyy-MM-ddTHH:mm:ss", Culture.InvariantCulture) 

当试图将DateTime.MinValue或DateTime.MaxValue插入到sql时,通常会出现此类型的错误。这不是一个好主意。你能打印出事件吗?

events.ForEach(x => Console.WriteLine(x.EventDate)) 
1

该解决方案与解析该特定的DateTime无关。我忘记了在使用DEFAULT约束的数据库中有一个日期时间列。一旦我照顾到这一切,一切工作正常。

相关问题