2012-04-04 24 views
8

Tengo una aplicación que usa LINQ-to-SQL con SQL Server CE 4. Sé que esto no es oficialmente compatible, pero lo hemos hecho funcionar, con el siguiente excepción En ocasiones, obtenemos un error con una fila en la base de datos cuando intentamos actualizarlo.DivideByZeroException con SQL Server CE 4 al eliminar grandes cantidades de filas

Usamos un DataContext para seleccionar una fila de la base de datos, actualizar algunas columnas (una columna booleana y una columna de bytes), luego llamamos al SubmitChanges(). Cuando nos sometemos a los cambios, estamos recibiendo una DivideByZeroException con el seguimiento de pila:

System.DivideByZeroException: Se ha intentado dividir por cero.
en System.Data.SqlServerCe.NativeMethodsHelper.CompileQueryPlan (IntPtr pQpCommand, Cadena pwszCommandText, opciones ResultSetOptions, IntPtr [] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr & pQpPlan, IntPtr pError)
en System.Data. SqlServerCe.NativeMethods.CompileQueryPlan (IntPtr pQpCommand, cadena pwszCommandText, opciones ResultSetOptions, IntPtr [] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr & pQpPlan, IntPtr pError)
en System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan()
en System.Data.SqlServerCe.SqlC eCommand.ExecuteCommand (CommandBehavior comportamiento, el método de cuerdas, opciones ResultSetOptions)
en System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
en System.Data.Linq.SqlClient.SqlProvider.Execute (consulta Expresión, QueryInfo QueryInfo, IObjectReaderFactory fábrica, Object [] parentArgs, objeto userArgs [], ICompiledSubQuery [] subconsultas, objeto LASTRESULT)
en System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (query Expresión, QueryInfo [] queryInfos, fábrica IObjectReaderFactory, Object [ ] userArguments, ICompiledSubQuery [] subQueries)
en System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Ex pression consulta)
en System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicUpdate (TrackedObject artículo)
en System.Data.Linq.ChangeDirector.StandardChangeDirector.Update (TrackedObject artículo)
en System.Data.Linq .ChangeProcessor.SubmitChanges (ConflictMode failureMode)
en System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode)
en System.Data.Linq.DataContext.SubmitChanges()

EDIT:

Tras la elaboración de perfiles, el problema parece ser generada en una instrucción de eliminación, similar a esto:

CANCELACIÓN de [WorkItemUid] DONDE ([OID] = 24151/* @ p0 /) Y ([WorkItemOid] = 745/ @ p1 /) Y ([SeriesInstanceUid] = '1.3.12.2.1107.5.1.4.54023.30000004101914490887500000063'/ @ p2 /) Y ([SopInstanceUid] = '1.3.12.2. 1107.5.1.4.54023.30000004101913521221800001089'/ @ p3 /) Y ([Completo] = 1) Y ([FailureCount] = 0/ @ p4 * /) Y ([Archivo] IS NULL) Y (NO ([Error] = 1))

El error estaba ocurriendo en una declaración en la que intentaba eliminar de forma individual ~ 1500 registros de claves externas. Cuando cambié el código para eliminar filas individualmente, lo reduje a aproximadamente 45 filas que no se podían eliminar. Luego utilicé SQL Compact Query Analyzer para intentar ejecutar la eliminación en las líneas, y también falló allí, con la excepción de divide por cero.

Por lo tanto, parece que no es un error de Linq-a-SQL, sino más bien algo con SQL Server Compact CE 4.0 que elimina estas filas. Intenté eliminar y comenzar con una base de datos limpia, y repliqué el llenado y luego eliminé de la base de datos, y el problema vuelve a ocurrir. Puede ser un problema cuando hay> 1500 registros de claves externas que sucede algo al eliminar.

Un montón de búsquedas de Google estaban en su mayoría vacías, pero encontré una referencia a un DivideByZeroException con SQL Server CE 3.5 en this de referencia. Confirmé que estoy usando los ensamblados de SQL Server CE 4.0, por lo que este no parece ser el problema. ¿Alguna idea sobre si el error anterior todavía se aplica a SQL Server CE 4.0? Parece después de una revisión más profunda que es el mismo problema.

+0

¿Cómo se hace que LINQ to SQL funcione con 4.0? – ErikEJ

+3

Creamos nuestro esquema en una base de datos 3.5, generamos el archivo dbml y luego lo ejecutamos en una base de datos 4.0 con el mismo esquema exacto. Parece que funciona en su mayor parte. Estamos ejecutando una aplicación de subprocesos múltiples contra la base de datos que hace una gran cantidad de actualizaciones y encartes. Hubo problemas de inestabilidad con 3.5, que son mejores con 4.0, pero tengo esta única excepción que se puede repetir con una actualización específica que está ocurriendo. Parece ser específico de datos. –

+0

¿Ha intentado ejecutar la declaración SQL directamente en la base de datos? ¿Has probado 4.0 SP1 CTP? – ErikEJ

Respuesta

3

La actualización a SQL Server Compact CTP1 parece haber resuelto el problema. Ya no veo las excepciones al eliminar filas como se informa en la pregunta. El problema parecía estar relacionado con la eliminación de filas de una tabla donde había> 1500 filas en una relación de clave externa.

Cuestiones relacionadas