由于DateTime精度,提交操作失败

时间:2011-01-24 21:11:28

标签: database datetime submit ria precision

RIA服务可以填充由服务器生成的属性。一个这样的值是ModifiedDate字段在我的表中,我有一个不是键的标识列。为了获得数据库生成的值,RIA使用它知道的刚刚插入的行的键值查询它在提交期间插入的记录。它使用以下查询处理此问题:

[WorkItemId],[WorkItemStatusCode], [EffectiveDate] 是该表的关键。

exec sp_executesql N'insert [dbo]。[WorkItemHistory] ([WorkItemId],[WorkItemStatusCode], [EffectiveDate], [DateCreated],[DateModified],[ModifiedByUserId],[StatusReason],[Description],[MarketId]) 值(@ 0,@ 1, @ 2 ,@ 3,@ 4,@ 5,@ 6,@ 7,null) 选择[iWorkItemHistoryId] 来自[dbo]。[WorkItemHistory] 其中@@ ROWCOUNT&gt; 0和[WorkItemId] = @ 0和[WorkItemStatusCode] = @ 1和 [EffectiveDate] = @ 2',N'@ 0 int,@ 1 varchar(25),@ 2 datetime2(7) ,@ 3 datetime2(7),@ 4 datetime2(7),@ 5 nvarchar(50),@ 6 nvarchar(100),@ 7 nvarchar(255)',@ 0 = 1,@ 1 ='CNCL',< strong> @ 2 ='2011-01-24 19:32:27.5028893',@ 3 ='2011-01-24 11:32:27.5018892',@ 4 ='2011-01-24 11:32 :27.5008891',@ 5 = N'at',@ 6 = N'NewDescription',@ 7 = N'New WorkItem -1/19/2011'

'2011-01-24 19:32:27.5028893 并不完全是存储在数据库中的内容。它会四舍五入,因此'Where'子句失败。

'2011-01-24 19:32:27.503'在数据库中。

为了解决这个问题,我可以将日期截断为'2011-01-24 19:32:27'或者我可以将日期从身份中删除或者我可以从iWorkItemHistoryId中取出自动增量计数器以便它不会在插入过程中不要重新查询值。

由于

1 个答案:

答案 0 :(得分:1)

想出来。

当我们通常存储CreatedDate和ModifiedDate时,精度损失是不可检测的。

但是,当我们在主键中使用日期时,会精确查询这些值。应该使用DateTime2来匹配DateTime.Now的.NET精度。

切换到Key字段上的DateTime2解决了问题。

日期字段的精度损失通常不会被检测到,因为我们通常会查询日期范围而不是单个日期,因为Key字段中的情况必须如此。