Frage zu Abhängigkeiten von Relationen in Access zu Dataset

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Rizzle.

    Frage zu Abhängigkeiten von Relationen in Access zu Dataset

    Moin,


    Ich muss ein kleines Programm schreiben, in dem Daten von einer Form für einen Roboter abgespeichert werden, je nach Produkt sende ich dem die Daten dann. (Das nur am Rande)

    Dazu habe ich mir ein Dataset und eine Accessdatenbank angelegt. Ich hab das kleine Dataset aus VisualStudio und aus Acces angehängt als Bild

    Als ich nur mit dem Dataset gearbeitet habe, hatte ich noch keine Probleme, jetzt wo ich die Acces angehängt habe, bekomme ich den Fehler:

    "System.Data.OleDb.OleDbException: "Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle 'Form' mit diesem Datensatz in Beziehung stehen muss."

    Und ich weiß leider nicht weiter wo ich den Fehler suchen muss.
    Wenn ich mir das Dataset während der Laufzeit ansehe, schreibt er die richtigen IDs in die Tabelle.

    Kann mir eventuell jemand einen Hinweis geben?


    Mit der Methode fülle ich das Dataset:

    VB.NET-Quellcode

    1. Sub savetoDataset()
    2. movelast()
    3. 'Zuerst die Form ...
    4. FormdatenDataSet.Form.AddFormRow(CInt(AnzahlSteineTextBox.Text), CInt(SteinehoeheTextBox.Text), FormnameTextBox.Text)
    5. 'Me.FormTableAdapter.Update(Me.FormdatenDataSet.Form)
    6. 'Dann die Greifer mit seinen Zonen.....
    7. If CbAnzahlSteintypen.SelectedItem >= 1 Then
    8. FormdatenDataSet.Greifer.AddGreiferRow(CInt(X_OffsetTextBox1.Text), CInt(Y_OffsetTextBox1.Text), CInt(Z_OffsetTextBox1.Text), 1, Zone1CheckBox1.CheckState, Zone2CheckBox1.CheckState, Zone3CheckBox1.CheckState, Zone4CheckBox1.CheckState,
    9. Zone5CheckBox1.CheckState, Zone6CheckBox1.CheckState, Zone7CheckBox1.CheckState, Zone8CheckBox1.CheckState, Zone9CheckBox1.CheckState,
    10. Zone10CheckBox1.CheckState, Zone11CheckBox1.CheckState, Zone12CheckBox1.CheckState)
    11. ' Me.GreiferTableAdapter.Update(Me.FormdatenDataSet.Greifer)
    12. End If
    13. If CbAnzahlSteintypen.SelectedItem >= 2 Then
    14. FormdatenDataSet.Greifer.AddGreiferRow(CInt(X_OffsetTextBox2.Text), CInt(Y_OffsetTextBox2.Text), CInt(Z_OffsetTextBox2.Text), 2, Zone2CheckBox2.CheckState, Zone2CheckBox2.CheckState, Zone3CheckBox2.CheckState, Zone4CheckBox2.CheckState,
    15. Zone5CheckBox2.CheckState, Zone6CheckBox2.CheckState, Zone7CheckBox2.CheckState, Zone8CheckBox2.CheckState, Zone9CheckBox2.CheckState,
    16. Zone10CheckBox2.CheckState, Zone11CheckBox2.CheckState, Zone12CheckBox2.CheckState)
    17. ' Me.GreiferTableAdapter.Update(Me.FormdatenDataSet.Greifer)
    18. End If
    19. If CbAnzahlSteintypen.SelectedItem >= 3 Then
    20. Me.GreiferBindingSource.MoveLast()
    21. FormdatenDataSet.Greifer.AddGreiferRow(CInt(X_OffsetTextBox3.Text), CInt(Y_OffsetTextBox3.Text), CInt(Z_OffsetTextBox3.Text), 3, Zone1CheckBox3.CheckState, Zone2CheckBox3.CheckState, Zone3CheckBox3.CheckState, Zone4CheckBox3.CheckState,
    22. Zone5CheckBox3.CheckState, Zone6CheckBox3.CheckState, Zone7CheckBox3.CheckState, Zone8CheckBox3.CheckState, Zone9CheckBox3.CheckState,
    23. Zone10CheckBox3.CheckState, Zone11CheckBox3.CheckState, Zone12CheckBox3.CheckState)
    24. ' Me.GreiferTableAdapter.Update(Me.FormdatenDataSet.Greifer)
    25. End If
    26. If CbAnzahlSteintypen.SelectedItem >= 4 Then
    27. Me.GreiferBindingSource.MoveLast()
    28. FormdatenDataSet.Greifer.AddGreiferRow(CInt(X_OffsetTextBox4.Text), CInt(Y_OffsetTextBox4.Text), CInt(Z_OffsetTextBox4.Text), 4, Zone1CheckBox4.CheckState, Zone2CheckBox4.CheckState, Zone3CheckBox4.CheckState, Zone4CheckBox4.CheckState,
    29. Zone5CheckBox4.CheckState, Zone6CheckBox4.CheckState, Zone7CheckBox4.CheckState, Zone8CheckBox4.CheckState, Zone9CheckBox4.CheckState,
    30. Zone10CheckBox4.CheckState, Zone11CheckBox4.CheckState, Zone12CheckBox4.CheckState)
    31. ' Me.GreiferTableAdapter.Update(Me.FormdatenDataSet.Greifer)
    32. End If
    33. 'Und dann noch die steine..
    34. For Each row As DataGridViewRow In DgvSteine.Rows
    35. FormdatenDataSet.Stein.AddSteinRow(row.Cells(1).Value, row.Cells(2).Value, row.Cells(0).Value, 1,
    36. DirectCast(DirectCast(Me.FormBindingSource.Current, DataRowView).Row, FormdatenDataSet.FormRow),
    37. DirectCast(DirectCast(Me.GreiferBindingSource.Current, DataRowView).Row, FormdatenDataSet.GreiferRow))
    38. 'Me.SteinTableAdapter.Update(Me.FormdatenDataSet.Stein)
    39. Next
    40. Me.TabControlEX1.SelectedIndex = 3
    41. End Sub


    Hier tritt der Fehler auf, wenn ich in die Acces schreiben will.
    So speichere ich in die Accesdatei:

    VB.NET-Quellcode

    1. Private Sub save()
    2. Me.Validate()
    3. Me.SteinBindingSource.EndEdit()
    4. Me.FormBindingSource.EndEdit()
    5. Me.GreiferBindingSource.EndEdit()
    6. Me.TableAdapterManager.UpdateAll(Me.FormdatenDataSet)
    7. End Sub





    Viele Grüße
    Bilder
    • DatsetFormen.png

      37,16 kB, 1.076×666, 89 mal angesehen
    • DatsetFormenInAcces.png

      21,4 kB, 1.001×686, 81 mal angesehen
    scheinbar versuchst du ein Stein zuzufügen, der auf ein Form verweist, was noch nicht zugefügt ist.
    Fürs Abspeichern komplexer Änderungen (Inserts, Updates, Deletes, in mehreren verknüpften Tabellen) muss man nach Inserts, Updates, Deletes unterscheiden, und ausserdem eine widerspruchsfreie Reihenfolge der Tabellen beachten.
    Obiges ("Stein zuzufügen, der auf ein Form verweist, was noch nicht zugefügt ist") - ist ja logisch, dass das nicht geht. Da muss man zuerst die Inserts der Form-Tabelle abspeichern, bevor man Steine zufügen kann.
    Noch ein Problem - grade bei Inserts ist, dass eine sinnvoll aufgebaute DB Primärschlüssel selbst vergibt: Das heisst: die PK die du im Dataset hast sind auf der DB ungültig. Sie müssen also während des Speicherns umgeändert werden in die von der DB vergebenen. Und das muss sich bis in ForeignKeys fortpflanzen.
    Ich hab da dolle Infrastruktur für gecodet, die sich um diesen nervtötenden Kram kümmert: Dataset->Db

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

    Danke für die Antwort, ich verstehe jetzt aufjedenfall den Fehler und auch wieso ich den nicht gefunden habe.
    Ich dachte wohl, dass der TableAdapterManager das kann... naive Annahme.

    Ich werde mir mal dein Beitrag durchlesen und versuchen umzusetzen, sonst frag ich hier nochmal nach, falls ich nochmal ein Brett vorm Kopf habe.

    Danke :)