【问题标题】:DateTime insertion and then selection: sequence contains no elementsDateTime 插入然后选择:序列不包含任何元素
【发布时间】:2012-07-23 18:29:52
【问题描述】:

我在sql server中的表结构是:

TableId int (Pk) identity

Data string

DateNTime DateTime

我的方法是::

public int insertData(string data){

Date= DateTime.Now;

Table table= new Table();

table.Data= data;

table.DateNTime=Date;

 this.DataContext.Set<Table>().Add(table);

this.DataContext.SaveChanges();

return this.DataContext.Tables.Single(b => b.DateNTime == Date).TableId

}

数据插入没有任何问题,但在返回 TableId 时 10 次中有 9 次出现异常“序列不包含元素”

可能是在保存表格行之前触发了选择命令并且我得到了这个错误,如果是我该怎么办?

谢谢 阿纳布

【问题讨论】:

    标签: asp.net-mvc entity-framework-4


    【解决方案1】:

    SaveChanges() 是同步的“阻塞”操作,在保存日期的事务提交之前不会返回。因此,当您调用查询时,日期肯定会保存在数据库中。

    我认为,这是一个精度/舍入问题。如果您查看 .NET 中 DateTime 的精度,您会看到(例如在 TimeOfDay 属性中):

    .NET 的 TimeOfDay DateTime 类型:10:32:51.0312500

    因此,精度为 10E-7 秒。 SQL Server 中的 datetime 只有 10E-3 秒的精度,而 .NET DateTime 在数据库中是这样保存的:

    SQL Serverdatetime类型的列值:10:32:51.030

    因此,它被四舍五入为三位数。当您运行查询时,.NET DateTime 会以高精度传输(如 SQL Server 中的 datetime2(7) 类型)...

    WHERE [Extent1].[MyDateTimeColumn] = @p__linq__0',
        N'@p__linq__0 datetime2(7)', @p__linq__0='2012-05-18 10:32:51.0312500'
    

    ... 等式比较失败,因为

    2012-05-18 10:32:51.0312500 != 2012-05-18 10:32:51.030

    如果您想要更高的精度,请在 SQL Server 中使用与 .NET DateTime 类型匹配的 datetime2(7) 作为类型。或者避免此类查询相等性,而是查询 +/- 1 秒的间隔或您的 DateTime 值周围的东西,如下所示:

    var date1 = Date.AddSeconds(-1);
    var date2 = Date.AddSeconds( 1);
    return this.DataContext.Tables
        .Single(b => b.DateNTime >= date1 && b.DateNTime <= date2)
        .TableId;
    

    (当然,如果您的保存速度超过每 2 秒,Single 可能会因“序列包含多个元素”异常而失败。)

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多