Löschen einer Zeile einer Tabelle mit untergeordneter Tabelle

  • VB.NET

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

    Löschen einer Zeile einer Tabelle mit untergeordneter Tabelle

    Hallo liebe Programmierer ich bins mal wieder:) Folgendes Problem: Ich habe ein Datagridview mit Werten aus einer Datatable aus einem Dataset von einer Datenbank. Der Tabelle ist eine weitere Tabelle untergeordnet. Nun versuche ich aus der übergeordneten Tabelle eine Zeile zu löschen. Ich selektiere die Zeile und betätige einen Lösch-Button. Zuerst suche ich ob sich Zeilen aus der untergeordneten Tabelle auf die Übergeordnete beziehen. Ist dies der Fall lösche ich alle. Anschließend lösche ich die selektierte Zeile der übergeordneten Tabelle. Jedoch bekomme ich folgende Fehlermeldung:
    Ein Ausnahmefehler des Typs "System.Data.SqlClient.SqlException" ist in System.Data.dll aufgetreten.

    Zusätzliche Informationen: Die DELETE-Anweisung steht in Konflikt mit der REFERENCE-Einschränkung 'FK_tra_f_pruefpunkt_f_pruefpunkt'. Der Konflikt trat in der eepa-Datenbank, Tabelle 'dbo.tra_f_pruefpunkt', column 'tra_to_fppe_id' auf.

    Die Anweisung wurde beendet.


    Weis leider nicht was ich dagegen unternehmen kann und hoffe auf eure Hilfe. Hier noch mein Code zum Löschen:

    VB.NET-Quellcode

    1. If MsgBox("Sind Sie sicher, dass Sie den Standard-Prüfpunkt " & dgv_Standard.CurrentRow.Cells("fppe_pruefpunkt").Value.ToString & " wirklich löschen wollen?", vbOKCancel) = 1 Then
    2. Dim sql As String
    3. sql = "SELECT * FROM tra_f_pruefpunkt WHERE tra_to_fppe_id = '" & dgv_Standard.CurrentRow.Cells("fppe_id").Value & "'"
    4. Dim da As New SqlDataAdapter(sql, My.Settings.eepaConnectionString)
    5. Dim dt As New DataTable
    6. da.Fill(dt)
    7. For Each dr As DataRow In dt.Rows
    8. Tra_f_pruefpunktTableAdapter.DeleteLanguage(dr.Item("tra_id"))
    9. Next
    10. EepaDataSet.tra_f_pruefpunkt.AcceptChanges()
    11. dgv_Standard.Rows.Remove(dgv_Standard.CurrentRow) 'Entfernt Zeile aus dem DGV speichert es jedoch noch nicht
    12. Me.F_pruefpunktTableAdapter.DeleteQuery(dgv_Standard.CurrentRow.Cells("fppe_id").Value) 'Anschließend wird der PP gelöscht
    13. End If


    Euer Steak
    Ich würd dir empfehlen, die DB erstmal beiseite zu lassen, und die Arbeit mittm typisierten Dataset zu erlernen - inklusive richtiger Datenmodellierung, also Festlegens geeigneter DataRelations.
    Löschst du bei einem geeignet konfigurierten Dataset eine übergeordnete Datarow, so sorgt die Löschweitergabe der DataRelation auch für die Löschung der ChildRows.

    Später, bei mit DB kann und sollte alles Updaten von Änderungen in nur einer einzigen Methode erfolgen, die einfach alle DataAdapter in richtiger Reihenfolge anweist, zu updaten. Die DataAdapter prüfen dabei selbständig, ob und wo und welche Änderung vorliegt, und führen das notwendige SqlCommand aus.
    Aber solch DataAdapter müssen richtig konfiguriert sein, und vorher muss erst noch das Datenmodell richtig konzipiert sein, und das Dataset korrekt eingerichtet.
    Daher: Spar dir den DB-Zugriff für später auf.

    Studiere vier Views-Videos für das Konfigurieren und Coden gegen ein typDataset

    Und Daten laden und speichern für alles mittm speichern/laden - ohne DB (s. dortige Vorbemerkung)!

    Check auch, ob dir was an Datenverarbeitungs-Vorraussetzungen fehlt, und hol das nach, weil ohne das gehts halt nicht.

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

    Ich hab mich mal durch deine Tuts durchgearbeitet und vermute ein großer Fehler war die Beziehung nicht auf "Sowohl Beziehungs- als auch Fremdschlüsseleinschränkung" einzustellen. Jedoch habe ich keinen Hinweis darauf entdeckt, der mir bei meiner Fehlerbehebung weiterhelfen könnte.. Wäre Mega wenn du mir da die expliziete Stelle in den Tuts nennen oder so helfen könntes:)
    nein, es ist nicht nur eine punktuelle Stelle, sondern das Tut zeigt einen ganz anderen Ansatz auf.

    Mit solchen Geschichten:

    VB.NET-Quellcode

    1. Dim dt As New DataTable
    2. '...
    3. Tra_f_pruefpunktTableAdapter.DeleteLanguage(dr.Item("tra_id"))
    4. '...
    5. EepaDataSet.tra_f_pruefpunkt.AcceptChanges()
    6. '...
    7. dgv_Standard.Rows.Remove(dgv_Standard.CurrentRow)
    kommt man auf keinen grünen Zweig - das ist alles unbrauchbar, und vergisste am besten.

    Übrigens richtig ist auf jeden Fall, in einer DataRelation "Sowohl Beziehungs- als auch Fremdschlüsseleinschränkung" einzustellen.

    Aber allein in deim klein Snippet sah ich bisher folgende Fehler:
    1. du hast Option Strict Off - mach dringend Option Strict On!
    2. du erstellst neue DataTables, statt die bestehenden zu befüllen
    3. du erstellst untypisierte DataTables
    4. du löschst inne DB (versuchst du wenigsten) und im DatagridView
      beides falsch - löschen kann das DGV selbst, da ist kein Code für zu schreiben
    5. selbst wenn codeseitig gelöscht werden sollte: da darf man weder aus der DB noch aus DGV löschen, sondern aus dem Dataset


    Also meine Empfehlung: Mach dir ein Testprojekt ohne DB, und erarbeite dir die Vorgehensweisen ganz neu, anhand der Tuts.