Typisiertes Dataset - Löschen von verknüpften Datensätzen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Typisiertes Dataset - Löschen von verknüpften Datensätzen

    Hallo Leute,

    Ich habe ein Dataset mit verknüpften Tabellen, u.a. einer Tabelle Vorrichtungen und einer Tabelle VorrichtungArtikelnummer.
    Die Tabelle VorrichtungArtikelnummer enthält als Fremdschlüssel die VorrichtungID. Die Tabellen sind mit einer Relation versehen,
    die Regeln für Insert, Update, Delete stehen auf Cascade.

    Ich bin davon ausgegangen, dass wenn ich eine Vorrichtung lösche, löscht er auch die zugehörigen Einträge in der VorrichtungArtikelnummer.

    Das klappt aber leider nicht.

    Muss ich zum automatischen Löschen von verknüpften Datensätzen noch etwas tun?

    Mfg Murdoc
    Gruß Murdoc

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Murdoc“ ()

    Das klappt aber leider nicht.
    Was wird dabei angeleiert und bei welcher Fehlerzeile geschieht es?

    Ich würde es immer so machen:
    Immer zuerst die untergeordneten Einträge löschen und dann die Row der übergeordneten Tabelle!
    Es geht aber auch anders herum:
    Kommt darauf an, wie die Relation zueinander eingestellt ist...
    Product-Table wäre die übergeordnete Parenttable und hat eine untergeordnete Tabelle:

    VB.NET-Quellcode

    1. For i = SampleDts.Product.Rows.Count - 1 To 0 Step -1
    2. SampleDts.Product.Rows(i).Delete()
    3. Next
    Da werden die Childeinträge mitgelöscht...
    funktioniert nur:
    *) immer von hinten weg löschen...
    *) wenn die Relation nur als Beziehung eingestellt ist...
    *) mit Beziehungs- und Fremdschlüsseleinschränkung und die Löschregel auf Kaskade eingestellt ist
    Sonst immer zuerst die untergeordneten Einträge löschen und dann die Parentzeile!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Wenn die Relation richtig gesetzt ist, werden die ChildRows mit der ParentRow automatisch mitgelöscht.
    @VB1963: Warum erst die ChildRows, dann die ParentRow? Welche praktischen Vorteile hat dies. Dass Du es so machst, ist mir klar, aber das Warum fehlt mir noch.
    Bilder
    • BeforeAndAfterRemovingParent.png

      23,32 kB, 826×385, 104 mal angesehen
    • Relation.png

      26,1 kB, 1.053×625, 112 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich teste mal das Beispiel von VB1963.

    Anonsten schau ich mir morgen noch einmal den Code an wenn ich frisch bin. Wahrscheinlich seh ich den Wald vor lauter Bäumen nicht :whistling:

    Die Beziehung stimmt soweit. Da du ja bestätigst das es (wenn man es richtig macht) funktioniert, liegt der Fehler irgendwo anders bei mir.
    Gruß Murdoc

    VaporiZed schrieb:

    aber das Warum fehlt mir noch.
    Wenn du die Löschregel nicht hättest, bekommst bestimmt eine InvalidConstraintException mit folgendem Text:
    Zusätzliche Informationen: Diese Zeile kann nicht gelöscht werden, da für die Beziehung FK_..._... Einschränkungen erzwungen werden, und das Löschen dieser Zeile untergeordnete Zeilen freilegen würde.
    Und wenn es ginge, dann gäbe es elternlose Kindzeilen...
    D.h. dass der Knackpunkt die richtige Einstellung der Löschregel ist. Also auch auf Cascade stellen - wie in meinem Screenshot, richtig? Oder hab ich's immer noch nicht voll erfasst?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.