Ich habe eine Anwendung mit LINQ-to-SQL mit SQL Server CE 4. Ich weiß, dass dies nicht offiziell unterstützt wird, aber wir haben es mit der folgenden Ausnahme funktioniert. Gelegentlich erhalten wir einen Fehler mit einer Zeile in der Datenbank, wenn wir versuchen, sie zu aktualisieren.
Wir verwenden DataContext
, um eine Zeile aus der Datenbank auszuwählen, ein paar Spalten zu aktualisieren (eine Boolesche und eine Byte-Spalte), dann rufen wir SubmitChanges()
auf. Wenn wir die Änderungen übermitteln, erhalten wir eine DivideByZeroException mit folgendem Stack-Trace:
System.DivideByZeroException: Versuch, durch Null zu teilen.
bei System.Data.SqlServerCe.NativeMethodsHelper.CompileQueryPlan (IntPtr pQpCommand, Zeichenfolge pwszCommandText, ResultSetOptions-Optionen, IntPtr [] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr & amp; pQpPlan, IntPtr pError)
bei System.Data.SqlServerCe.NativeMethods.CompileQueryPlan (IntPtr pQpCommand, Zeichenfolge pwszCommandText, ResultSetOptions-Optionen, IntPtr [] pParamNames, IntPtr prgBinding, Int32 cDbBinding, IntPtr & amp; pQpPlan, IntPtr pError)
bei System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan ()
bei System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand (CommandBehavior Verhalten, String-Methode, ResultSetOptions-Optionen)
bei System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery ()
bei System.Data.Linq.SqlClient.SqlProvider.Execute (Ausdruck Abfrage, QueryInfo QueryInfo, IObjectReaderFactory Factory, Objekt [] parentArgs, Object [] userArgs, ICompiledSubQuery [] Unterabfragen, Object lastResult)
bei System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (Ausdruck Abfrage, QueryInfo [] QueryInfos, IObjectReaderFactory Factory, Objekt [] userArguments, ICompiledSubQuery [] Unterabfragen)
bei System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (Ausdruck Abfrage)
bei System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicUpdate (TrackedObject Artikel)
bei System.Data.Linq.ChangeDirector.StandardChangeDirector.Update (TrackedObject Artikel)
bei System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode)
bei System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode)
bei System.Data.Linq.DataContext.SubmitChanges ()
BEARBEITEN:
Beim Profiling scheint das Problem in einer delete-Anweisung ähnlich wie folgt zu entstehen:
LÖSCHEN VON [WorkItemUid] WHERE ([Oid] = 24151 / * @ p0 /) UND ([WorkItemOid] = 745 / @ p1 /) UND ([SeriesInstanceUid] = '1.3.12.2.1107.5.1.4.54023.30000004101914490887500000063' / @ p2 /) UND ([SopInstanceUid] = '1.3.12.2.1107.5.1.4.54023.30000004101913521221800001089' / @ p3 /) UND ([Vollständig] = 1) UND ([Fehlerzahl] = 0 / @ p4 * /) UND ([Datei] ist NULL) UND (NICHT ([Fehlgeschlagen] = 1))
Der Fehler trat in einer Anweisung auf, in der ich versuchte, ~ 1500 Fremdschlüsseleinträge einzeln zu löschen. Als ich den Code änderte, um Zeilen einzeln zu löschen, beschränkte ich ihn auf ungefähr 45 Zeilen, die nicht gelöscht werden konnten. Ich habe dann SQL Compact Query Analyzer verwendet, um zu versuchen, das Löschen auf den Zeilen selbst auszuführen, und es ist dort auch fehlgeschlagen, mit der Division durch Null Ausnahme.
Es scheint also kein Linq-zu-Sql-Fehler zu sein, sondern etwas mit SQL Server Compact CE 4.0 selbst, das diese Zeilen löscht. Ich habe versucht, mit einer sauberen Datenbank zu löschen und zu starten, replizierte das Auffüllen und löschte dann aus der Datenbank, und das Problem tritt erneut auf. Es könnte ein Problem sein, wenn es & gt; 1500 Fremdschlüssel zeichnet auf, dass beim Löschen etwas passiert.
Eine Reihe von Google-Suchen war meist leer, aber ich fand einen Verweis auf eine DivideByZeroException
mit SQL Server CE 3.5 bei dies Referenz. Ich habe bestätigt, dass ich die SQL Server CE 4.0-Assemblys verwende, daher scheint dies nicht das Problem zu sein. Irgendwelche Ideen, ob der obige Fehler immer noch für SQL Server CE 4.0 gilt? Es erscheint nach weiterer Überprüfung das gleiche Problem.
Das Upgrade auf SQL Server Compact CTP1 scheint das Problem gelöst zu haben. Ich sehe die Ausnahmen nicht mehr beim Löschen von Zeilen, wie in der Frage berichtet. Das Problem scheint mit dem Löschen von Zeilen aus einer Tabelle in Verbindung zu stehen, in denen & gt; 1500 Zeilen in einer Fremdschlüsselbeziehung.
Tags und Links .net linq-to-sql sql-server-ce