DataSet - Relationen definieren

  • VB.NET

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

    DataSet - Relationen definieren

    Hallo zusammen,

    habe mal eine Frage zur Definition von Beziehungen. Ich möchte in meiner Anwendung erreichen, dass bei einer Relation/Verknüpfung die Aktualisierungsweitergabe

    gestattet ist, die Löschweitergabe an die Child-Datensätze aber unterbunden wird. Ich habe es mit folgendem Code probiert:

    VB.NET-Quellcode

    1. Public ds As New DataSet("MyDataset")DataColumnParent = ds.Tables("Kategorien").Columns("Kategorie")
    2. DataColumnChild = ds.Tables("Kunden").Columns("Kategorie")_Relation01 = New System.Data.DataRelation("Kategorie-FK", DataColumnParent, DataColumnChild)
    3. ds.Relations.Add(_Relation01)

    Problem ist, dass die Aktualisierungsweitergabe funzt, aber bei der Löschweitergabe die Child-Datensätze nicht mehr anzeigt werden.
    Das gleiche Problem habe ich auch, wenn ich folgenden Code verwende:

    VB.NET-Quellcode

    1. Dim _Relation_FK As ForeignKeyConstraint = New ForeignKeyConstraint("_Relation_FK", DataColumnParent, DataColumnChild)_Relation_FK.DeleteRule = Rule.None
    2. _Relation_FK.UpdateRule = Rule.Cascade_Relation_FK.AcceptRejectRule = AcceptRejectRule.Cascade
    3. ds.Tables("Kunden").Constraints.Add(_Relation_FK)
    4. ds.EnforceConstraints = True

    In MS-Access ist es nicht möglich, übergeordnete Datensätze zu löschen, wenn es Child-Datensätze gibt (Aktualisierungweitergabe).
    Wie bekomme ich diese Funktionalität im DataSet hin?
    Dirk

    Dirk2006 schrieb:

    In MS-Access ist es nicht möglich, übergeordnete Datensätze zu löschen, wenn es Child-Datensätze gibt (Aktualisierungweitergabe).
    Glaub ich nicht.

    Aber du kannst mal probieren, die LöschweiterGabe bei deiner Relation auf None zu setzen. Dann müsste beim Löschen eines Datensatzes mit Children ja eine Exception fliegen, und somit der Lösch-Vorgang verunmöglicht sein.

    2 Fragen:
    1. Warum fuhrwerkst du das per Code zusammen? Sowas kann man doch mit Leichtigkeit im Dataset-Designer einstellen?
    2. Was hast du gegen Löschweitergabe? Ich finde das ein sehr sinnvolles Feature. Hingegen eine Löschung mal zulassen (bei keine Childs), mal nicht - sowas verwirrt den User, und da musstedann eh was extra-coden, dasses ihm erklärt wird.
    Tja, mit Access kommt folgende Fehlermeldung:

    - Der Datensatz kann nicht gelöscht werden, da die Tabelle Kunden in Beziehung stehende Datensätze enthält -

    Ich "fuchtel" das im Code, weil ich gern die Grundlagen drauf haben möchte, bevor ich die Tools nutze. Dauert ein bisschen, dafür sitzt es dann.

    Außerdem kann ich dem Designer-Code nichts abgewinnen....wer will das überprüfen....

    Und ich möchte nicht, dass ein Kunde gelöscht wird, wenn jemand die Kategorie löscht. Finde es einfach besser, den Nutzer darauf

    aufmerksam zu machen, dass sich in den untergeordneten Tabellen noch entsprechende Werte befinden. So kann er selbst entscheiden,

    wie er verfahren möchte....

    Bis jetzt habe ich immer direkt auf die DB zugegriffen, mal schauen was das jetzt noch mit den DataSet´s wird ...*lach

    Irgendwie klappt es noch nicht, muss einfach nochmal nachlesen....

    Trotzdem Danke für Deine Hilfe...

    Dirk

    Dirk2006 schrieb:

    Tja, mit Access kommt folgende Fehlermeldung:
    - Der Datensatz kann nicht gelöscht werden, da die Tabelle Kunden in Beziehung stehende Datensätze enthält -
    1. Wie gesagt: Man kann es Access auch beibringen, dass Löschweitergabe vollzogen wird.
    2. Wie gesagt: stell doch inne DataRelation die Lösch-Regel auf .None, dann kriegst du da auch so eine schöne Fehlermeldung.

    Dirk2006 schrieb:

    Ich "fuchtel" das im Code, weil ich gern die Grundlagen drauf haben möchte, bevor ich die Tools nutze.

    Ich empfehle ja, grad annersrum vorzugehen: Erst lernen, die Tools richtig zu benutzen, dann nachgucken, was die Tools für Code generiert haben.

    Codeseitig so Zeugs zu machen ist häufig ziemlich tricky, und hat auch negative Seiten-Effekte:
    zB. bei dir guckt man in den Dataset-Designer, sieht "DataRelation so und so", und stimmt garnet - weil im FormLoad frickelste das ja wieder um!

    Auch ist der Ort der Um-Frickelei architektonisch falsch gewählt: Diese Manipulation gehört nicht ins CodeBehind des Forms, sondern ins CodeBehind des Datasets.

    ZB wenn du ein gleiches Dataset auf einem anneren Form einsetzst, verhältes sich dann auf einmal anners.

    Größter Nachteil des händisch-codens ist aber, dass man auf diese Weise u.U. urs viel Code in seinen FormCode drinne hat, und viel Code ist einfach immer schwerer verständlich als wenig Code.
    Also die Tools halten dir die Code-Dateien frei von trivial-Stoff, sodass sich deine Dateien auf das wirklich wesentliche der Anwendungslogik konzentrieren können.