DBExtensions speichert den foreignkey nicht

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

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    DBExtensions speichert den foreignkey nicht

    Erst mal Hallo super Forum habt Ihr da :thumbsup:

    Ich habe zwei Tabellen eine Master (Part) und eine Child (Prozess). Die Datenbank ist eine SQL und wird per DBExtension von ErfinderdesRads koordiniert.
    Nun füge ich per Code eine neue Partrow hinzu, gleich unmittelbar danach folgen mehrere Prozessrow. Beim Speichern in die Datenbank ist komischerweise immer ein foreignkey der Prozessrow noch immer minus.
    Der code sieht vereinfacht so aus:

    VB.NET-Quellcode

    1. Sub Parthinzufügen()
    2. Dim PartBS = frm_Artikel.AdressBindingSource.At(Of AdressRow)()
    3. Dim rwParent = frm_Artikel.BlechERPDataSet.Adress.FindByAdressID(CInt(PartBS.AdressID))
    4. frm_Artikel.BlechERPDataSet.Part.AddPartRow(rwParent, 1, usw...)
    5. frm_Artikel.FK_Adress_PartBindingSource.MoveTo("Name", CStr(.Cells(NameIndex).Value)))
    6. for i = 1 to 3
    7. Prozesshinzufügen()
    8. next i
    9. End Sub
    10. Public Function Prozesshinzufügen() As Boolean
    11. Dim PartBS = frm_Artikel.FK_Adress_PartBindingSource.At(Of PartRow)()
    12. Dim _rwParent = frm_Artikel.BlechERPDataSet.Part.FindByPartID(CInt(PartBS.PartID))
    13. Dim _Position As Integer = frm_Artikel.FKPartPartProzessBindingSource.Count
    14. frm_Artikel.BlechERPDataSet.PartProzess.AddPartProzessRow(_rwParent, "_Prozessname", usw...)
    15. Return True
    16. End Function
    17. Public Sub save()
    18. BlechERPDataSet.Save(me)
    19. End Sub

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

    hmm - das ist aber sehr was anneres als sauber programmiert.

    erstmal ist frm_Artikel ein Datentyp - das ist kein Objekt.
    Sollte man in dieser Form besser nicht benutzen. Vermutlich steht der Code in einem Modul, wo er nicht hingehört, also da hängt bestimmt auch die Notwendigkeit dran, die Architektur zu korrigieren.

    Dann brauchst du kein FindByAddressID, weil du vmtl. die AddressRow direkt vonne PartRow abrufen kannst.
    Die Zeile kapier ich garnet PartBs ist doch schon eine AddressRow, und nun suchst du noch eine AddressRow, mit derselben ID?
    Sieht mir sehr verhaspelt aus - oder kannst du den Sinn vons das erklären?

    Weiter tu ich erstmal nicht drüber nachdenken.
    Da hast du Recht, der Code ist verhaspelt, bitte entschuldige.
    Nun habe ich den Code aufgeräumt, leider ist das Phänomen noch immer vorhanden.
    Form Artikel ist eine Form wo die Artikel angezeigt werden. Der Importvorgang, wo der untenstehende Code drin steht, ist eine Form bei welcher der Artikel (aus externer Datei) dargestellt ausgewählt und importiert wird.

    VB.NET-Quellcode

    1. Private Sub Werkstückimportieren() Handles DataGridView1.DoubleClick
    2. Dim AdressBS = frm_Artikel.AdressBindingSource.At(Of AdressRow)() 'Adressrow damit das Werkstück dem richtigen Kunden zugeordnet wird
    3. '-- Werkstück importieren Start
    4. BlechERPDataSet.Part.AddPartRow(AdressBS, "Werkstück1", usw...)
    5. frm_Artikel.FK_Adress_PartBindingSource.MoveTo(AdressBS)
    6. DataGridView1.Rows.Remove(DataGridView1.CurrentRow) 'Zeile aus DGV löschen damit nicht zweimal das selbe Werkstück importiert werden kann
    7. '-- Werkstück importieren Ende
    8. '-- Arbeitsprozess importieren Start
    9. BlechERPDataSet.PartProzess.AddPartProzessRow(frm_Artikel.FK_Adress_PartBindingSource.At(Of PartRow)(), "zuschneiden", 1, usw...) 'Hier ist in der Datenbank der foreignkey -1
    10. BlechERPDataSet.PartProzess.AddPartProzessRow(frm_Artikel.FK_Adress_PartBindingSource.At(Of PartRow)(), "reinigen", 2, usw...)'Hier ist in der Datenbank der foreignkey korrekt
    11. '-- Arbeitsprozess importieren Ende
    12. End Sub
    13. 'Speichern tu ich mit dem Befehl
    14. BlechERPDataSet.Save(Me)

    Das richtige Verhalten ist, dass das Dataset negative, provisorische Primärschlüssel generiert.
    Beim Abspeichern generiert die DB positive, endgültige Primärschlüssel, und schickt die auch gleich zurück zum Dataset.

    Also neu hinzugefügte Zeilen müssen beim Abspeichern von negativer ID auf eine positive umspringen.
    Wir kommen der Sache näher.
    ich habe die Relation nur im Dataset gemacht, nicht aber in der Datenbank. Dies habe ich nun nachgeholt und jetzt gibt mit Visual Studio zumindest eine Fehlermeldung aus:
    Ein Ausnahmefehler des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten. Zusätzliche Informationen: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_PartProzess_Part". The conflict occurred in database "BlechERP", table "dbo.Part", column 'PartID'. The statement has been terminated.

    Jetzt weis VB zumindest das was nicht in Ordnung ist.

    SQL Code der Relation aus der DB

    SQL-Abfrage

    1. ALTER TABLE [dbo].[PartProzess] WITH CHECK ADD CONSTRAINT [FK_PartProzess_Part] FOREIGN KEY([PartID])
    2. REFERENCES [dbo].[Part] ([PartID])
    3. ON UPDATE CASCADE
    4. ON DELETE CASCADE

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