DataSet / ForeignKeyConstraint Error / Schlüsselwerte

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Counterbug.

    DataSet / ForeignKeyConstraint Error / Schlüsselwerte

    Hallo!

    Ich habe jetzt ein DataSet mit zwei DataTables. Das dtRezept ist mit cID an dtZutaten gebunden.
    Funktioniert alles wunderbar!
    Wenn ich jetzt jedoch aus einer zweiten Form (Rezept erstellen) ein neues Datenset in die DataTables schreiben will bekomme ich folgenden Fehler:

    Für ForeignKeyConstraint FK_dtRezept_dtZutaten müssen die untergeordneten Schlüsselwerte (9) in der übergeordneten Tabelle vorhanden sein.

    Hab versucht die untergeordnete dTable zuerst zu füllen, auch ohne Erfolg!
    Muss ich der Übergeordneten dTable anweisen die Daten zu übernehmen? Weil für mich der Fehler so aussieht als wären die Daten in der übergeordneten Tabelle noch nicht vorhanden.
    Du versuchst, mit einem Fremdschlüssel auf einen nicht vorhandenen Datensatz einer anderen Tabelle zu verweisen.
    Du musst zuerst die Zutaten anlegen, auf die du danach mit dem Rezept verweisen kannst.

    Wobei es gar nicht sein sollte, dass deine Table Rezept einen Fremdschlüssel auf eine Zutat hat, weil ein Rezept doch aus mehreren Zutaten besteht.
    Jetzt hab ich des so, kommt keine Fehlermeldung, aber auch kein neuer Eintrag im DGV!?!

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub bErstellen_Click(sender As Object, e As EventArgs) Handles bErstellen.Click
    2. Dim conv = TypeDescriptor.GetConverter(GetType(Bitmap))
    3. Dim image As Bitmap = CType(pbRezErstellen.Image, Bitmap)
    4. Dim _image As Byte() = DirectCast(conv.ConvertTo(image, GetType(Byte())), Byte())
    5.  
    6. Dim ds1 As New DataSet1.DataTable1DataTable
    7. 'ds1._TD1NewRow(_image, rtbRezErstellen.Text, "%", tbPortionen.Text, rtbRezErstellen.Text, Form1.dgvRezeptbuch.Rows.Count + 1, Form1.dgvRezeptbuch.Rows.Count + 1)
    8. 'ds1.AddDataTable1Row(_image, rtbRezErstellen.Text, "%", tbPortionen.Text, rtbRezErstellen.Text, Form1.dgvRezeptbuch.Rows.Count + 1, Form1.dgvRezeptbuch.Rows.Count + 1)
    9. Dim ds2 As New DataSet1.DataTable2DataTable
    10. 'Tabelle für Zutaten
    11. For Each _row As DataGridViewRow In dgvRezErstellen.Rows
    12. ds2.Rows.Add(CStr(_row.Cells(0).Value), CStr(_row.Cells(1).Value), Form1.dgvRezeptbuch.Rows.Count + 1)
    13. ' ds2.AddDataTable2Row(CStr(_row.Cells(0).Value), CStr(_row.Cells(1).Value), dt1row)
    14. Next
    15. 'Rezept-Daten
    16. Dim dt1row As DataTable1Row = CType(ds1.NewDataTable1Row, DataTable1Row)
    17. dt1row.cID = Form1.dgvRezeptbuch.Rows.Count + 1
    18. dt1row.cBild = _image
    19. dt1row.cBeschreibung = rtbRezErstellen.Text
    20. dt1row.cLink = "%"
    21. dt1row.cPortionen = CInt(tbPortionen.Text)
    22. dt1row.cRezNummer = Form1.dgvRezeptbuch.Rows.Count + 1
    23. dt1row.cZubereitung = rtbRezErstellen.Text
    24. ds1.AddDataTable1Row(dt1row)
    25. ''DGV aktualisieren
    26. Form1.DataGridView1.Refresh()
    27. Form1.DataGridView2.DefaultCellStyle.WrapMode = DataGridViewTriState.True
    28. Form1.DataGridView2.Refresh()
    29. Form1.dgvRezeptbuch.Refresh()
    30. Form1.dgvZutaten.Refresh()
    31. End Sub

    Dein Dataset ist fehlerhaft...
    Bei deiner Tabelle2 fehlt der Fremdschlüssel zur Tabelle1...
    Vergib bei den Tabellen ordentliche Namen...
    Ich habe dir eine verkürzte Version des Datasets einmal angehängt, damit du siehst, was ich meine:

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

    Nee, das stimmt nicht!

    Ich hab eine Beziehung von cID vom DT1 zu cID vom DT2!
    Damit habe ich bei den Rezepten eine fortlaufende cID die sich im DT2 nur dann erhöht wenn ein neues Rezept hinzugefügt wird!
    Oder muss ich vice versa eine Beziehung herstellen? Also einmal vom DT1 und einmal zum DT1?!?

    Ähm, und wie benenne ich das DataTable um ohne das mir die ganzen Zuweisungen verloren gehen, ich also praktisch nochmal alles neu schreiben darf?

    Morrison schrieb:

    Ich hab eine Beziehung von cID vom DT1 zu cID vom DT2
    ...und cID von DT2 (Tabelle2) ist ein Primärschlüssel, wo die Spalte eindeutig (Unique) ist - wie soll das dann gehen. Dann kannst du ein Rezept mit maximal einer Zutat erstellen...

    Ähm, und wie benenne ich das DataTable um ohne das mir die ganzen Zuweisungen verloren gehen, ich also praktisch nochmal alles neu schreiben darf?
    einfach vorher eine ordentliche Benamung durchführen...
    ich empfehle dir wärmstens: Tu dir das nicht an.
    Die ganze Entwicklungszeit werden dich die falschen Namen ständig irritieren, und wenndes iwann fertig hast, ists doch nur ein Produkt für die Tonne.
    Niemand kann sowas warten.
    Was ich übrigens gelegentlich mache, wenn mir eine bessere Benamung eingefallen ist:
    Erst ein Backup, und dann lasse ich die VolltextSuche/Ersetzen drüberbügeln.
    Das müsst bei Namen wie DataTable1, DataTable2 sogar konfliktfrei durchführbar sein.

    Also Suche/Ersetzen - aktuelles Projekt.
    Anschließend neu kompilieren und hoffen...
    Und wenn du dich für richtige Benennungen entschieden hast, willst du dich vielleicht auch für ein richtiges Datenmodell entscheiden, deins wird nämlich unter Umständen redundant.

    Schau dir mal das an.



    Zwischen Rezept und Zutat herrscht eine n:m-Relation, ein Rezept kann mehrere Zutaten haben und eine Zutat kann mehreren Rezepten zugewiesen werden. Und die Menge gibst du für jede Zutat pro Rezept an. Keine Redundanz. Wobei natürlich noch Id bei Rezeptzutat rauskönnte, da die beiden Fremdschlüssel schon den Primärschlüssel abbilden.