10

SQL Server CE 4 で LINQ-to-SQL を使用するアプリケーションがあります。これが公式にサポートされていないことはわかっていますが、次の例外を除いて動作するようにしました。データベースの行を更新しようとすると、エラーが発生することがあります。

a を使用しDataContextてデータベースから行を選択し、いくつかの列 (ブール値とバイト列) を更新してから、 を呼び出しますSubmitChanges()。変更を送信すると、次のスタック トレースで DivideByZeroException が発生します。

System.DivideByZeroException: ゼロ除算を試みました。
System.Data.SqlServerCe.NativeMethodsHelper.CompileQueryPlan (IntPtr pQpCommand、文字列 pwszCommandText、ResultSetOptions オプション、IntPtr[] pParamNames、IntPtr prgBinding、Int32 cDbBinding、IntPtr& pQpPlan、IntPtr pError)
で System.Data.SqlServerCe.NativeMethods.CompileQueryPlan (IntPtr pQpCommand ) 、文字列 pwszCommandText、ResultSetOptions オプション、IntPtr[] pParamNames、IntPtr prgBinding、Int32 cDbBinding、IntPtr& pQpPlan、IntPtr pError)
System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
で System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 動作、
System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()の文字列メソッド、ResultSetOptions オプション)
System.Data.Linq.SqlClient.SqlProvider.Execute (式クエリ、QueryInfo queryInfo、IObjectReaderFactory ファクトリ、Object[] parentArgs、Object[] userArgs、ICompiledSubQuery[] subQueries、Object lastResult)
で System.Data.Linq.SqlClient.SqlProvider .ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(式クエリ)
System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicUpdate (TrackedObject アイテム)
で System.Data.Linq.ChangeDirector.StandardChangeDirector.Update (TrackedObject アイテム)
で System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode)
System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode)
で System.Data.Linq.DataContext.SubmitChanges() で

編集:

プロファイリングすると、次のような削除ステートメントで問題が発生したように見えます。

DELETE FROM [WorkItemUid] WHERE ([Oid] = 24151 /* @p0 /) AND ([WorkItemOid] = 745 / @p1 /) AND ([SeriesInstanceUid] = '1.3.12.2.1107.5.1.4.54023.30000004101914490887500000063' / @p2 /) AND ([SopInstanceUid] = '1.3.12.2.1107.5.1.4.54023.30000004101913521221800001089' / @p3 /) AND ([完了] = 1) AND ([FailureCount] = 0 / @p4 */) AND ([ファイル] IS NULL) AND (NOT ([失敗] = 1))

〜1500の外部キーレコードを個別に削除しようとしたステートメントでエラーが発生していました。行を個別に削除するようにコードを変更したところ、削除できなかった行が 45 行ほどに絞り込まれました。次に、SQL Compact Query Analyzer を使用して、行自体で削除を実行しようとしましたが、そこでも失敗し、ゼロ除算の例外が発生しました。

そのため、Linq-to-Sql エラーではなく、SQL Server Compact CE 4.0 自体がこれらの行を削除しているようです。クリーンなデータベースを削除して開始しようとしましたが、データの入力とデータベースからの削除を複製しましたが、問題が再び発生しました。1500 を超える外部キー レコードがある場合、削除時に何かが発生することが問題になる可能性があります。

一連の Google 検索はほとんど空でしたが、このDivideByZeroExceptionリファレンスで SQL Server CE 3.5へのリファレンスを見つけました。SQL Server CE 4.0 アセンブリを使用していることを確認したので、これは問題ではないようです。上記のバグがまだ SQL Server CE 4.0 に当てはまるかどうかについて何か考えはありますか? さらに見直したところ、同じ問題であることがわかりました。

4

1 に答える 1

3

SQL Server Compact CTP1にアップグレードすると、問題が解決したようです。質問で報告されているように、行を削除するときに例外が表示されなくなりました。この問題は、外部キー関係に1500を超える行があったテーブルから行を削除することに関連しているように見えました。

于 2012-04-09T19:53:00.743 に答える