Eine seltsame Exception

  • VB.NET
  • .NET (FX) 4.0

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Eine seltsame Exception

    Hallo,

    ich bekomme ab und zu (sehr sehr selten) beim Starten des Programms folgende Exception:


    Es passiert, während neue Datensätze ins Dataset hinzugefügt werden, weil die Anwendung mit Daten vom Gerät, mit dem sie kommuniziert, initialisiert werden. "value" war jedes Mal im gültigen Bereich (ich habe sie angeschaut).

    Leider konnte ich keine Regelmäßigkeiten feststellen, nach denen die Exception auftritt. Wenn man nochmal neu startet, geht es immer. Und auch so, max. alle 20 Mal, vielleicht noch viel seltener...

    Kann jemand damit was anfangen?
    Nein, der Fehler passiert an sich sehr selten, obwohl jedes Mal das Gleiche gemacht wird... Nicht pro 20 Datensätze, sondern pro 20 oder mehr Starts des Programms (da werden jedes Mal einige Datensätze erstellt).

    Und meine Datenbankstruktur kann ich hier schlecht posten, sie hat über 25 Tabellen mit Relationen usw ;) Bisher konnte niemand durchsteigen, egal, wem ich sie gezeigt habe...
    Ich habe keine Datenbank, nur DataSet.

    Ich habe jetzt IsXXIDNull gegen XXRow Is Nothing ersetzt, ich habe die Erfahrung gemacht, dass das Erste nicht immer funktioniert.

    Die Exception passiert an der einzigen Stelle, wo ich Datensätze hinzufüge (sondern werden sie nur dauernd anders zugeordnet). Leider, wie gesagt, sehr selten, wenn ich danach noch mal exakt das Gleiche ausführe, funktioniert es ja...

    EDIT: Doch, wo ich nochmal den Code sehe, ich füge noch an anderen Stellen Datensätze in andere Tabellen hinzu, allerdings nie über NewXXRow wie hier (wegen Sortieren).

    @Coldfire
    Hier ist der Code:

    VB.NET-Quellcode

    1. Public Sub AddValues(ByVal fr() As MapProfFuncRow, ByVal MapDevVal As MapDeviceValueRow, ByVal statStr As STATUS_STRUCT)
    2. Dim MapValFunc As dtsSTCModbus.MapValFuncRow
    3. ' Dim IsValid = True
    4. Dim lstVal As New List(Of ValueRow)
    5. With _dts
    6. For Each ProfFunc In fr
    7. Dim comm = From mpfc In ProfFunc.GetMapProfFuncCommRows Select mpfc.ProfileCommandRow.CommandTitle
    8. If Not ProfFunc.ProfileRow.HasCommID OrElse _
    9. (ProfFunc.ProfileRow.HasCommID AndAlso _
    10. (statStr.dir <> "" AndAlso comm.Contains(statStr.dir)) OrElse _
    11. ((statStr.NU <> "" AndAlso comm.Contains(statStr.NU)) AndAlso (statStr.T21 <> "" AndAlso comm.Contains(statStr.T21)))) Then
    12. If ProfFunc.EnumFuncRow IsNot Nothing Then
    13. MapValFunc = .MapValFunc.AddMapValFuncRow(ProfFunc.EnumFuncRow, Nothing)
    14. Dim rwVal = .Value.NewValueRow
    15. rwVal.MapDeviceValueRow = MapDevVal
    16. rwVal.MapValFuncRow = MapValFunc
    17. rwVal.Offset = ProfFunc.EnumFuncRow.Offset
    18. rwVal.ValueTitle = ProfFunc.EnumFuncRow.FunctionTitle
    19. rwVal.Avail = True
    20. lstVal.Add(rwVal)
    21. End If
    22. If ProfFunc.LinFuncRow IsNot Nothing Then
    23. MapValFunc = .MapValFunc.AddMapValFuncRow(Nothing, ProfFunc.LinFuncRow)
    24. Dim rwVal = .Value.NewValueRow
    25. rwVal.MapDeviceValueRow = MapDevVal
    26. rwVal.MapValFuncRow = MapValFunc
    27. rwVal.Offset = ProfFunc.LinFuncRow.Offset
    28. rwVal.ValueTitle = ProfFunc.LinFuncRow.FunctionTitle
    29. rwVal.Avail = True
    30. lstVal.Add(rwVal)
    31. End If
    32. End If
    33. Next
    34. lstVal.Sort(Function(x, y) x.Offset.CompareTo(y.Offset))
    35. For Each rwVal In lstVal
    36. .Value.AddValueRow(rwVal)
    37. Next
    38. End With
    39. End Sub

    u hast 25 Tabellen und nur Datasets ? Da würde ich anfangen, mich mindestens man mit sql server compact zu beschäftigen.
    Ansonsten:
    The internal index is corrupted "5" message typically gets thrown when 2 or more rows end with the same row id.
    social.msdn.microsoft.com/Foru…-index-is-corrupted-5-on-
    Du, ich brauche kein Server, das passt schon. Und ich habe EIN Dataset, nicht mehrere. Weil alle Tabellen miteinander verbunden sind. Was soll ich mit einem Server? Das Programm wird nicht unbedingt an einem internetfähigen Rechner laufen.

    Aber danke schön für die Fehlermeldungbeschreibung. Die Frage ist, warum passiert es nur ganz selten und beim nächsten Mal ist immer alles in Ordnung? Warum soll da an der Stelle die gleiche ID kommen, wenn ich .NewXXRow nutze? Die Rows wurden auch davor nie gelöscht (es passiert immer nur am Anfang, wenn)
    Also sql server compact ist kein extra Server, sondern ein im Programm eingebettete Serverlösung. ADO standalone zu verwenden war nur als offlinelösung in Kombination mit einem Server gedacht. So wie ich das verstanden habe. Solange es gut geht, was solls. Aber deine Fehlermeldung stammt schon aus den inneren Kreisen von Ado. Da läuten bei mir schon dei Alarmglocken.
    Also: verschwindet der Fehler wenn keine Spalte die Identity-Eigenschaft hat? Das wär so meine erste Frage.
    also mach zuerst mal ein oder mehrere Backups von deinem Projekt :)

    Im Designer gibt es für jede DataColumn die Eigenschaften
    Autoincrement bzw. unique bzw. AllowDBNull
    Unique kann man auf false setzen. Die Spalte ID bleibt natürlich dabei bestehen.
    Deine Relationen weden dadurch auch ungültig. Also NUR ZUM TESTEN
    Es springt ja im Debug-Modus hin, kein Stack usw. Und es ist so selten, dass ich lange warten kann, bis sie wieder ausgelöst wird... Ich schaue, ob ich nächste Woche wieder mal eine erwische. Jetzt bin ich schon im WE ohne VS zu Hause :)
    Also, der Code, in dem das auftritt, ist ja offensichtlich vom DataSet-Designer generiert.

    Wenn ich das bei mir nachvollziehe, entsteht folgender Eintrag:

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")>
    3. Public Property ValueTitle() As String
    4. Get
    5. Try
    6. Return CType(Me(Me.tabletableValue.ValueTitleColumn), String)
    7. Catch e As Global.System.InvalidCastException
    8. Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte ValueTitle in Tabelle tableValue ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set(value As String)
    12. Me(Me.tabletableValue.ValueTitleColumn) = value
    13. End Set
    14. End Property

    Bei dem von Dir in Post#1 dargestellten Screenshot sieht der Setter anders aus, die Übergabe/Definition von value fehlt da.
    Kann dies die Ursache sein, oder bin ich auf dem falschen Dampfr?
    Sporadisch auftretende Fehler lassen sich bei mir meist auf Latenz-probleme im Netzwerk zurückführen.

    Ich bekomme oftmals ähnliche Fehlermeldungen wenn zuviele Nutzer gleichzeitig auf meine Access-Datenbank zugreifen. Bisher konnte ich es meist über das "CommandTimeout" abfangen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    us4711 schrieb:

    Bei dem von Dir in Post#1 dargestellten Screenshot sieht der Setter anders aus, die Übergabe/Definition von value fehlt da.
    Kann dies die Ursache sein, oder bin ich auf dem falschen Dampfr?


    Stimmt, sieht seltsam aus. Ich werde am Montag nachschauen, wie er sonst aussieht. Die Frage ist ja auch, woher das kommt (ist ja, wie du richtig sagtest, eine automatisch generierte Designer-Datei), und warum es nur ab un zu auftritt.

    Interessanterweise hat value einen Wert zum Zeitpunkt der Exception...

    @Schamash
    Ich mache nichts mit Netzwerken...
    sonst sieht er so aus:

    VB.NET-Quellcode

    1. <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
    2. Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
    3. Public Property MandantenVerw() As String
    4. Get
    5. Try
    6. Return CType(Me(Me.tableBerechtigung.MandantenVerwColumn), String)
    7. Catch e As Global.System.InvalidCastException
    8. Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte MandantenVerw in Tabelle Berechtigung ist DBNull.", e)
    9. End Try
    10. End Get
    11. Set(value As String)
    12. Me(Me.tableBerechtigung.MandantenVerwColumn) = value
    13. End Set
    14. End Property
    Allerdings das ohne die Setter-Variable explizit zu deklarieren ist glaub auch gültig - dann wird sie intern mit dem Namen "value" generiert.

    Für deine Exception würde ich mal nachdenken, ob das was mit Threading zu tun haben könnte.

    ErfinderDesRades schrieb:

    Für deine Exception würde ich mal nachdenken, ob das was mit Threading zu tun haben könnte.


    Stimmt, da hast du Recht, es wird im anderen Thread generiert. Ich müsste in dem Fall die Methode in die GUI rausführen und von da wieder aufrufen (Event wird schon sowieso gesendet, ich bräuchte an der Stelle nur die Methode aufrufen).
    Ich werde es am Montag machen, leider kann ich es nicht wirklich testen, weil es ja so selten auftritt... Aber sicher ist sicher.