2012-07-23 57 views
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次出现异常“序列不包含任何元素”

是否可以在保存表行之前触发select命令,如果有,我得到这个错误,我该怎么做?

感谢 ARNAB

回答

2

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

我认为,这是一个精度/舍入问题。如果您在使用.NET看一个DateTime的精确度,你会看到(例如在TimeOfDay属性):10:3​​2:

的TimeOfDay .NET DateTime类型的51.0312500

因此,精度为10E-7秒。在SQL服务器A datetime仅具有10E-3秒之精确度和.NET DateTime在数据库中保存的是这样的:的SQL Server

列值datetime类型:10:3​​2: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

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

+0

感谢您的详细解释,衷心感谢.. – Arnab 2012-07-24 05:07:12