1

我在 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 次出现异常“序列不包含元素”

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

谢谢阿纳布

4

1 回答 1

2

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

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

.NETDateTime类型的 TimeOfDay:10:32:51.0312500

因此,精度为 10E-7 秒。SQL Server 中的 Adatetime只有 10E-3 秒的精度,.NETDateTime在数据库中保存如下:

SQL Server 类型的列值datetime:10:32:51.030

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

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

如果您想要更高的精度,请datetime2(7)在 SQL Server 中使用与 .NET 类型匹配的 asDateTime类型。或者避免此类查询相等性,而是查询 +/- 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可能会因“序列包含多个元素”异常而失败。)

于 2012-07-23T21:42:27.577 回答