SQL-Befehlfolge zum Löschen einer Beziehung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von nightrider63.

    SQL-Befehlfolge zum Löschen einer Beziehung

    Hallo Leute.

    Ich bräuchte mal Eure Hilfe. Ich komme irgendwie nicht weiter. Siehe hierzu den Programmcode im Dateianhang.
    Ich habe in Visual Studio 2019 ein Programm mit vb.net (WinForms) erstellt.
    Das Programm verbindet sich dabei mit einer Access-DB. Die Datenbank hat 2 Tabellen (tbl_Rechnungen, tbl_Fahrtkosten)
    Über eine Prozedur (private sub Run_Beziehung1 ...) habe ich zwischen den beiden Tabellen eine Beziehung mit referentieller Integrität (Löschweitergabe) erstellt.

    Ich möchte dies aber wieder rückgängig machen und zwar mit Programmcode und nicht in Access einfach die Beziehung löschen.
    In der Prozedur (Private sub Run_Beziehung1a ...) habe ich dies erfolgslos versucht.
    Entweder bekomme ich einen Syntax-Fehler oder wie im Code (siehe Dateianhang) eine Fehlermeldung: CHECK-Beschränkung nicht vorhanden.

    Wie muss die SQL-Befehlsfolge lauten, damit dies funktioniert?

    Beziehungen.txt

    Visual Basic-Quellcode

    1. ​Public Function DeleteRelationship(strTable1 As String, strTable2 As String) As Boolean
    2. Dim rel As DAO.Relation
    3. For Each rel In CurrentDb.Relations
    4. If (rel.Table = strTable1 And rel.ForeignTable = strTable2) Or (rel.Table = strTable2 And rel.ForeignTable = strTable1) Then
    5. CurrentDb.Relations.Delete rel.Name
    6. End If
    7. Next
    8. End Function

    bytes.com/topic/access/answers…eate-delete-relationships
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Ich geb's auf.
    Habe heute 5h versucht eine Lösung zu finden.
    Google und Bücher haben mir nicht geholfen.
    Entweder bekomme ich eine Fehlermeldung oder einen Syntax-Fehler und einmal hatte ich sogar Hoffnung weil der Code keinen Fehler ausgespuckt hat.
    Leider war aber die Access-DB unverändert, sprich die Beziehung war noch vorhanden.
    Es gibt halt Grenzen.

    Befehle wie: CREATE TABLE ... oder DROP TABLE funktionieren. Auch lässt sich die Beziehung erstellen. Nur löschen lässt sie sich nicht.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

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

    Hallo und Danke für den Super-Link. Da kann ich noch viel nachschauen und lernen.

    Ich bin nun einen kleinen Schritt weiter gekommen.
    Und zwar habe ich folgendes festgestellt: Das Löschen der Beziehung funktioniert nur, wenn ich vorher auch die Beziehung mit der SQL-Befehlsfolge angelegt habe.
    (ALTER TABLE tbl_Fahrtkosten ADD CONSTRAINT Relation1 FOREIGN KEY ([Re_ID]) REFERENCES tbl_Rechnungen ([Re_ID]) ON DELETE CASCADE)

    Dann funktioniert auch das Löschen mit:
    (ALTER TABLE tbl_Fahrtkosten DROP CONSTRAINT Relation1)

    Der Grund warum es vorher nicht funktionert hat, ist die Bezeichnung der Beziehung "Relation1"
    Die Beziehung wurde nämlich vorher mit Access angelegt. Access hat hier vermutlich einen bestimmten Namen für die Beziehung erstellt.
    Um also diese Beziehung zu löschen benötige ich diesen von Access angelegten Namen (Fremdschlüssel)

    Hat jemand eine Idee wie ich den Namen der Beziehung (von Access erstellt) auslesen kann?
    post#2 zeigt doch die Lösung, musst du umschreiben für .NET

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim sTableMaster As String = "tbl_Employee"
    3. Dim sTableChild As String = "tbl_Contacts"
    4. Dim AccessDatabaseEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine()
    5. Dim AccessDatabase As Microsoft.Office.Interop.Access.Dao.Database
    6. Dim rel As Microsoft.Office.Interop.Access.Dao.Relation
    7. Dim DeleteRelation As Boolean
    8. Try
    9. AccessDatabase = AccessDatabaseEngine.OpenDatabase("E:\Contacts.mdb")
    10. For Each rel In AccessDatabase.Relations
    11. If (rel.Table = sTableMaster And rel.ForeignTable = sTableChild) _
    12. Or (rel.Table = sTableChild And rel.ForeignTable = sTableMaster) Then
    13. AccessDatabase.Relations.Delete(rel.Name)
    14. DeleteRelation = True
    15. Exit For
    16. End If
    17. Next
    18. Catch ex As Exception
    19. MessageBox.Show(ex.Message)
    20. Finally
    21. AccessDatabase.Close()
    22. End Try
    23. End Sub


    Import von DAO nicht vergessen
    Danke. Dein Code schaut professionell aus.
    Ich hab jetzt den DAO verweis importiert. Leider klappt das irgendwie nicht.
    Es kommen Fehlermeldungen wie: Der Typ "Microsoft.Office.Interop.Access.Dao.Relation" ist nicht definiert.
    Ich bin wahrscheinlich einfach zu blöd dazu.
    sorry sollte so aussehen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop.Access.Dao
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Dim sTableMaster As String = "tbl_Employee"
    6. Dim sTableChild As String = "tbl_Contacts"
    7. Dim AccessDatabaseEngine As New Microsoft.Office.Interop.Access.Dao.DBEngine()
    8. Dim AccessDatabase As Microsoft.Office.Interop.Access.Dao.Database
    9. Dim rel As Microsoft.Office.Interop.Access.Dao.Relation
    10. Dim DeleteRelation As Boolean
    11. Try
    12. AccessDatabase = AccessDatabaseEngine.OpenDatabase("E:\Contacts.mdb")
    13. For Each rel In AccessDatabase.Relations
    14. If (rel.Table = sTableMaster And rel.ForeignTable = sTableChild) _
    15. Or (rel.Table = sTableChild And rel.ForeignTable = sTableMaster) Then
    16. AccessDatabase.Relations.Delete(rel.Name)
    17. DeleteRelation = True
    18. Exit For
    19. End If
    20. Next
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message)
    23. Finally
    24. AccessDatabase.Close()
    25. End Try
    26. End Sub
    27. End Class