1

SQLサーバーの私のテーブル構造は次のとおりです。

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()同期の「ブロッキング」操作であり、日付を保存するトランザクションがコミットされる前に戻りません。したがって、クエリを呼び出すと、日付は確実にデータベースに保存されます。

精度/丸めの問題だと思います。.NETで a の精度を見ると、次のように表示されDateTimeます (たとえば、TimeOfDayプロパティで)。

.NETDateTimeタイプの TimeOfDay: 10:32:51.0312500

したがって、精度は 10E-7 秒です。SQL Serverの Adatetimeは 10E-3 秒の精度しかなく、.NETDateTimeはデータベースに次のように保存されます。

SQL Serverdatetimeタイプの列の値: 10:32:51.030

そのため、3 桁に丸められます。クエリを実行すると、.NETは ( SQL ServerDateTimeの型として) 高精度で送信されます ...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)、.NET 型と一致する SQL Server の as 型を使用します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すると、「シーケンスに複数の要素が含まれています」という例外で失敗する可能性があります。)

于 2012-07-23T21:42:27.577 に答える