1

わかりました。SQL Server Express 2008 と .Net 3.5 (c#) を使用しています。

データベースにいくつかの日時フィールドがあり、(Linq-to-Sql を使用して) 行を編集しようとしています。「行が見つからないか、変更されていません」というエラーが表示されます。

生成された 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();
4

5 に答える 5

4

このリンクを参照してください。

System.Data.Linq.ChangeConflictException: 行が見つからないか変更されました

# High precision datetime fields are used. The solution is to set

UpdateCheck を使用して、その列を DBML ファイルに適用しない

これで問題は解決しましたが、ハックのように感じます。

他の人がどう思うかを見るために、これを開いたままにします。

于 2009-10-23T10:24:19.663 に答える
1

この投稿を確認してください。DateTime 列を監視し、dbml とデータベースの間で異なるデータ型をチェックする必要があることを説明し、最後に、LinQ 楽観的同時実行アプローチについて説明しています。

于 2011-07-29T16:38:25.243 に答える
0

あなたの例の唯一の違いはミリ秒なので、SQLプロファイラーを使用して元のSelectがミリ秒を返すかどうかを判断します。次に、その問題を修正できるかどうかを確認します。行データにミリ秒が含まれているようですが、selectがそれらを返していません。

あなたがそれをした後、あなたはまだ問題を抱えています、私たちは次のステップがどうなるかを見ることができます。

于 2009-10-23T09:54:51.627 に答える
0
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)
于 2009-10-23T09:42:13.447 に答える
0

基本的に、MSSQL スキーマと Linq データ コンテキストは、前述の構成ではうまく連携していません。DB スキーマまたはデータ コンテキストのいずれかを変更できます。

MSSQL データ型の変更

1 分の精度を使用できる場合は、 datetimeの代わりにsmalldatetimeを使用しています。

LINQ to SQL データ コンテキストを変更する

1 分よりも高い精度が必要な場合は、LiamB 自身の回答を参照して、データ コンテキストの列のUpdateCheck を Never に設定してください。

于 2016-08-05T08:15:57.213 に答える