【问题标题】:DivideByZeroException with SQL Server CE 4 when deleting large numbers of rows删除大量行时 SQL Server CE 4 出现 DivideByZeroException
【发布时间】:2012-04-04 18:37:27
【问题描述】:

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

我们使用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 行为、字符串方法、ResultSetOptions 选项)
在 System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
在 System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询,QueryInfo 查询信息,IObjectReaderFactory 工厂,对象 [] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object 最后一个结果)
在 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(表达式查询,QueryInfo[] queryInfos,IObjectReaderFactory 工厂,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()

编辑:

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

从 [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([文件]为空) AND (NOT ([失败] = 1))

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

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

一堆谷歌搜索大多是空的,但我确实在this 参考中找到了对带有 SQL Server CE 3.5 的DivideByZeroException 的引用。我已经确认我正在使用 SQL Server CE 4.0 程序集,所以这似乎不是问题。关于上述错误是否仍适用于 SQL Server CE 4.0 的任何想法?经过进一步审查,它似乎是同样的问题。

【问题讨论】:

  • 如何使 LINQ to SQL 与 4.0 一起工作??
  • 我们在 3.5 数据库中创建我们的模式,生成 dbml 文件,然后针对具有相同模式的 4.0 数据库运行。它似乎在大多数情况下都有效。我们正在针对数据库运行一个多线程应用程序,该应用程序执行大量更新和插入。 3.5 存在不稳定问题,4.0 更好,但我有一个例外,它可以通过发生的一个特定更新重复。它似乎是特定于数据的。
  • 您是否尝试过直接对数据库执行 SQL 语句?你试过 4.0 SP1 CTP 吗?
  • @ErikEJ,我能够在 SQL Compact 查询分析器中执行相同的语句,并且在某些记录上也发生了错误。我开始认为当有超过 1500 条外键记录时会出现错误,但这还没有得到证实。
  • 我赞成这个只是为了评论让 LINQ to SQL 在 CE 4 中工作。你应该为代码项目写一篇文章!

标签: .net linq-to-sql sql-server-ce


【解决方案1】:

升级到SQL Server Compact CTP1 似乎已经解决了这个问题。删除问题中报告的行时,我不再看到异常。该问题似乎与从具有 > 1500 行外键关系的表中删除行有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多