日時に関するLinq-To-Sqlの問題?
-
06-07-2019 - |
質問
OK、SQL Server Express 2008と.Net 3.5(c#)を使用しています
データベースにいくつかの日時フィールドがあり、行を編集しようとしています(Linq-to-Sqlを使用)エラー" Row not found or changed.quot;
生成されたSQLを取得するのに少し時間を費やしましたが、問題はdatetimeに付加されたミリ秒に起因するようです。
動作しない生成されたSQL
@p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45]
@p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36]
@p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27]
AND ([SignUpDate] = @p5)
AND ([LastActivityDate] = @p6)
AND ([LastLoginDate] = @p7)
自分で修正して動作するようにした場合
@p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [20/10/2009 16:04:45.390]
@p6: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 10:15:36.733]
@p7: Input DateTime (Size = 0; Prec = 0; Scale = 0) [23/10/2009 09:27:27.747]
AND ([SignUpDate] = @p5)
AND ([LastActivityDate] = @p6)
AND ([LastLoginDate] = @p7)
これを回避する方法のオプションは何ですか?
これを追加するのは私の編集コードです
var UserToEdit = this.GetUser(UserId);
UserToEdit.Forename = Fields["Forename"];
UserToEdit.Surname = Fields["Surname"];
UserToEdit.DateOfBirth = Convert.ToDateTime(Fields["DateOfBirth"]);
UserToEdit.DisplayName = Fields["DisplayName"];
UserToEdit.TelephoneNumber = Fields["TelephoneNumber"];
_db.SubmitChanges();
解決
こちらのリンクをご覧ください
System.Data.Linq.ChangeConflictException:行が見つかりませんまたは変更
# High precision datetime fields are used. The solution is to set
UpdateCheckをその列に適用しない DBMLファイル
これで問題は解決しましたが、ハッキングのように感じます。
他の人の意見を見るために、これを開いたままにします。
他のヒント
チェックこの投稿では、DateTime列に注目し、dbmlとデータベース間の異なるデータ型をチェックする必要があることを説明し、最後にLinQの楽観的同時実行アプローチを説明します。
where foo.SignupDate >= signUpDate
&& foo.SignUpDate < signUpDate.AddSeconds(1)
&& foo.LastActivityDate >= lastActivityDate
&& foo.LastActivityDate < lastActivityDate.AddSeconds(1)
&& foo.LastLoginDate >= lastActivityDate
&& foo.LastLoginDate < lastActivityDate.AddSeconds(1)
例の唯一の違いはミリ秒であるため、元のSelectがミリ秒を返すかどうかを判断するためにSQLプロファイラーを使用します。次に、その問題を修正できるかどうかを確認します。行データにはミリ秒が含まれているようですが、selectはそれらを返していません。
それを実行しても問題が解決しない場合、次のステップがどうなるかを確認できます。
基本的に、MSSQLスキーマとLinqデータコンテキストは、上記の構成では正常に動作しません。 DBスキーマまたはデータコンテキストを変更できます。
MSSQLデータ型の変更
smalldatetime を使用しています代わりに datetime の場合、 1分の精度を使用できます。
LINQ to SQLデータコンテキストの変更
1分以上の精度が必要な場合は、 UpdateCheckをNeverに設定するためのLiamBの回答をご覧ください。データコンテキスト。