10

我有一个使用带有 SQL Server CE 4 的 LINQ-to-SQL 的应用程序。我知道这不是官方支持的,但我们已经让它工作了,但有以下例外。有时,在尝试更新数据库时,我们会在数据库中遇到错误。

我们使用 aDataContext从数据库中选择一行,更新一些列(一个布尔列和一个字节列),然后我们调用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 , String pwszCommandText, ResultSetOptions options, IntPtr[] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr& pQpPlan, IntPtr pError)
在 System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
在 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 行为,字符串方法,ResultSetOptions 选项)
在 System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
在 System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询,QueryInfo queryInfo,IObjectReaderFactory 工厂,Object[] parentArgs,Object[] userArgs,ICompiledSubQuery[] subQueries,Object lastResult)
在 System.Data.Linq.SqlClient.SqlProvider System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute 处的.ExecuteAll(表达式查询,QueryInfo[] queryInfos,IObjectReaderFactory 工厂,Object[] userArguments,ICompiledSubQuery[] subQueries)
(表达式查询)
在 System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicUpdate(TrackedObject item)
在 System.Data.Linq.ChangeDirector.StandardChangeDirector.Update(TrackedObject item)
在 System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
在 System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
在 System.Data.Linq.DataContext.SubmitChanges()

编辑:

分析后,问题似乎是在删除语句上生成的,类似于:

从 [WorkItemUid] 中删除 ([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 ([Complete] = 1) AND ([FailureCount] = 0 / @p4 */) AND ([File]是 NULL) AND (NOT ([Failed] = 1))

该错误发生在我试图单独删除约 1500 个外键记录的语句中。当我更改代码以单独删除行时,我将其范围缩小到大约 45 行无法删除。然后,我使用 SQL Compact 查询分析器尝试在行本身上执行删除,但它也确实失败了,除以零异常。

因此,这似乎不是 Linq-to-Sql 错误,而是 SQL Server Compact CE 4.0 本身删除了这些行。我试图删除并从一个干净的数据库开始,并复制填充然后从数据库中删除,问题再次发生。当删除时发生超过 1500 个外键记录时,这可能是一个问题。

一堆谷歌搜索大多是空的,但我确实在此参考中找到了对SQLDivideByZeroException 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 回答