[解決済み] SQL Server Compact EditionデータベースのLINQ to SQLで、"Row not found or changed "例外を解決するにはどうすればよいですか?
質問
LINQ to SQL 接続で 2 つのプロパティを更新した後に DataContext に対して SubmitChanges を実行すると(SQL Server Compact Edition に対して)、 "Row not found or changed." ChangeConflictException が発生しました。
var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);
deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;
ctx.SubmitChanges();
このクエリにより、以下のようなSQLが生成されます。
UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
明らかな問題点は WHERE 0=1 レコードを読み込んだ後、"deviceSessionRecord"のプロパティがすべて正しく、主キーが含まれていることを確認しました。 また、"ChangeConflictException"をキャッチしたときに、なぜこれが失敗したのかについての追加情報はありません。 この例外は、データベース内のちょうど1つのレコード(私が更新しようとしているレコード)でスローされることも確認しました。
不思議なのは、コードの別のセクションに非常によく似た update 文があり、次の SQL が生成されて、SQL Server Compact Edition データベースが実際に更新されることです。
UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8
Database SchemaとLINQクラスを生成するDBMLの両方で、適切なプライマリーフィールドの値が特定されていることを確認しました。
これはほとんど2つの質問に分かれると思います。
- なぜ例外が発生するのですか?
- 2つ目の生成されたSQLを確認したところ、競合を検出するためには、すべてのフィールドをチェックするのがよさそうですが、これはかなり非効率的だと想像されます。 これは常にこの方法で動作するのでしょうか? 主キーだけをチェックするような設定はありますか?
この2時間、この問題と戦ってきましたので、どんな助けでもお願いします。
解決方法は?
それは嫌なことだが、簡単なことだ。
O/R-Designerのすべてのフィールドのデータ型が、SQLテーブルのデータ型と一致しているかどうかを確認します。 nullableをダブルチェック! カラムは、O/R-DesignerとSQLの両方でNullableであるか、両方でNullableでないかのどちらかである必要があります。
たとえば、NVARCHAR 列 "title"は、データベースで NULLable とマークされ、値 NULL を含んでいます。この列は O/R マッピングでは NOT NULLable とマークされていますが、LINQ では正常に読み込まれ、列の文字列は NULL に設定されます。
- では、何かを変更して SubmitChanges()を使用します。
- LINQ は SQL クエリを生成します。 WHERE [title] IS NULL" を含み、タイトルが他の誰かによって変更されていないことを確認します。
- LINQは、以下のプロパティを検索します。 [タイトル]をマッピングに追加します。
- LINQは[title]がNOT NULLableであることを発見する。
- タイトル] は NULL 値がないので 論理上、NULLになることはあり得ません。
- そこで、クエリを最適化するために、LINQは を "where 0 = 1" に置き換えます。 SQLでは、"never"に相当します。
フィールドのデータ型がSQLのデータ型と一致しない場合や、フィールドが存在しない場合も、LINQはSQLのデータがデータを読み込んでから変更されていないことを確認できないので、同じ症状が現れます。
関連
-
[解決済み] ServicePointManagerは、*スキームのプロキシをサポートしていません[closed]。
-
[解決済み] ポストバックまたはコールバックの引数が無効です。 イベント検証は '<pages enableEventValidation="true"/>' を使用して有効になっています。
-
[解決済み] .net 4.5アップグレード後、System.Web.Httpが見つからない
-
[解決済み] VB.NETで線を引く方法
-
[解決済み] ASP.NET control to render a <div>
-
[解決済み] DelphiとDelphi.NETの違いについて
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] terminationGracePeriodSeconds not
-
[解決済み] PowerShellで文字列がNULLまたは空であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] Math.Round(2.5)はなぜ3でなく2を返すのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WCFとは何か、何ができるのか?
-
[解決済み] CLSID {XXXX} を持つコンポーネントの COM クラスファクトリの取得は、次のエラーにより失敗しました: 80040154。
-
[解決済み] データテーブルの並べ替え
-
[解決済み] "ItemsSourceを使用する前に、Itemsコレクションを空にする必要があります。"
-
[解決済み] BasicHttpsBindingとWsHttpBinding with Transport securityの違いは何ですか?
-
[解決済み] SQL Server Compact EditionデータベースのLINQ to SQLで、"Row not found or changed "例外を解決するにはどうすればよいですか?
-
[解決済み] このコンピュータには、.NET Framework 4.6またはそれ以降の更新プログラムがすでにインストールされています。
-
[解決済み] WPFの場合、x:Name属性とName属性の違いは何ですか?
-
[解決済み] System.Timers.Timer vs System.Threading.Timer
-
[解決済み] WCF - メッセージサイズのクォータを増加させる方法