SQL Befehl INSERT INTO + JOIN

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    SQL Befehl INSERT INTO + JOIN

    Hallo zusammen,

    ich bin nicht der stärkste im erklären, ich versuchs aber dennoch... denn leider weiß ich nicht mehr weiter und benötige Tipps und Tricks von Euch :)

    Ich schreibe gerade ein Programm der Daten aus einer *.CSV Datei in eine DataGridView einliest und danach in eine ältere Access Datenbank *.mdb (Access 97) speichert.

    Nun habe ich gedacht das ich fast fertig bin, allerdings hat mich eine Fehlermeldung auf den Boden der Tatsachen zurückgeholt...

    Im Code seht ihr, dass ich die Daten aus dem DataGridView per INSERT INTO in die Datenbank speichern möchte. Leider klappt dies nicht da die Fehlermeldung

    "Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle 'Daten_HELP' mit diesem Datensatz in Beziehung stehen muss.



    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Try
    3. For Each row As DataGridViewRow In DataGridView1.Rows
    4. Dim constring As String = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"
    5. Using con As New OleDbConnection(constring)
    6. Using cmd As New OleDbCommand("INSERT INTO Daten_PRO (ZEICHNR, POSNR, QUANTITY, ELMNR) " & _
    7. "VALUES(@ZEICHNR, @POSNR, @QUANTITY, @ELMNR) ", con)
    8. cmd.Parameters.AddWithValue("@ZEICHNR", row.Cells("ZEICHNR").Value)
    9. cmd.Parameters.AddWithValue("@POSNR", row.Cells("POSNR").Value)
    10. cmd.Parameters.AddWithValue("@QUANTITY", row.Cells("QUANTITY").Value)
    11. cmd.Parameters.AddWithValue("@ELMNR", row.Cells("ELMNR").Value)
    12. '
    13. con.Open()
    14. cmd.ExecuteNonQuery()
    15. con.Close()
    16. End Using
    17. End Using
    18. Next
    19. MessageBox.Show("Funzt!")
    20. Catch ex As Exception
    21. MessageBox.Show(ex.Message)
    22. End Try
    23. End Sub


    Die Beziehung seht Ihr hier:


    Jetzt hatte ich mir gedacht das ich die Abhängigkeit einfach per Code Änderung durchführen kann.
    Aber leider funktioniert das nicht, ich vermute das ich anders vorgehen muss leider weiss ich nicht wie.

    VB.NET-Quellcode

    1. Using cmd As New OleDbCommand("INSERT INTO Daten_PRO (ZEICHNR, POSNR, QUANTITY, ELMNR) " & _
    2. "SELECT Daten_Pro.ZEICHNR, Daten_Pro.POSNR, Daten_Pro.QUANTITY, Daten_Pro.ELMNR " & _
    3. "FROM (test Daten_Pro INNER JOIN " & _
    4. "Daten_HELP ON Daten_Pro.ZEICHNR = Daten_HELP.ZEICHNR AND Daten_Pro.ANDR = Daten_Help.ANDR AND Daten_Pro.BLATTNR = Daten_HELP.BLATTNR) " & _
    5. "VALUES(@ZEICHNR, @POSNR, @QUANTITY, @ELMNR) ", con)


    Sobald ich dann diesen Code nutze erhalte ich ständig Syntax Fehler Semikolon (;)

    Hat jemand eine Idee wie ich das lösen könnte?

    PS: Die beigefügten Codes sind gekürzt..

    Danke
    Bilder
    • Beziehung.jpg

      18,9 kB, 358×175, 889 mal angesehen

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

    TryCatch ist ein heißes Eisen
    INSERT INTO test

    Bist Du da sicher?

    Leider sind die Spalten wieder wunderbar benannt, dass man sofort erkennen kann, worum es sich handelt.
    Also ohne zu wissen, in welche Tabelle Du Daten einfügst, und ohne zu wissen, welche Beziehungen zu anderen Tabellen da sind, wirds schwierig.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    ...ich sag ja, in erklären bin ich nicht sonderlich gut :P

    Spaß beiseite.... Die Daten schreibe ich in DATEN_PRO nicht in test ....habs korrigiert, das war noch der Stand aus der letzten Zwischenablage ich habe ja ganze Zeit versucht herumzuprobieren.
    Es gibt nur diese Abhängigkeit zwischen DATEN_PRO und DATEN_HELP die "ZEICHNR", "ANDR" sowie "BLATTNR"....

    Bin ich denn auf den richtigen weg gewesen mit INNER JOIN?

    Übrigens... der Beitrag zu "TryCatch ist ein heißes Eisen" ist sehr interessant und auf jeden Fall hilfreich. Danke :thumbsup:

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

    Ok, gut. Eine dieser Tabellen (oder beide, aber das ist sehr unwahrscheinlich) muss Fremdschlüssel auf die andere haben. Welche das ist, sieht man im Screenshot nicht so gut (es gibt über neuntausend Darstellungen von 1 zu n beziehungen und alle verhalten sich anders, was die Positionierung der 1 und des n betrifft).
    Die Fehlermeldung lautet ja
    Der Datensatz kann nicht hinzugefügt oder geändert werden, da ein Datensatz in der Tabelle 'Daten_HELP' mit diesem Datensatz in Beziehung stehen muss

    Es muss also eine Beziehung zu der Daten_HELP-Tabelle geben. Entweder befindet sich in der Daten_PRO-Tabelle eine Spalte, in der irgendwas (der sogenannte Fremdschlüssel) drin stehen muss, was auf einen Datensatz in der Daten_HELP-Tabelle verweist, oder umgekehrt.
    Die im Screenshot fett markierten Spaltennamen dürften wohl Teil von so einer Beziehung sein, aber es ist nicht ganz klar, auf welcher Seite der Fremdschlüssel ist.

    Beim Einfügen bringt INNER JOIN leider nichts. Außer man kopiert was von einer Tabelle in eine andere, dann kann man, wenn es angebracht ist, auch Joinen, aber das ist hier ja nicht der Fall.

    Und ja, Try-Catch sollte man vermeiden, wenn man sowieso nicht weiß, was man mit der gefangenen Exception machen soll. Du gibst zwar die Fehlermeldung aus, aber was dann? Soll das Programm weiterlaufen? Ohne Daten? Wenn man nicht genau weiß, was jetzt funktioniert hat und wo genau das Problem aufgetreten ist?
    Wenn mans so macht, schmiert das Programm dann üblicherweise später erst recht ab, wenn irgendwelche Daten, die eigentlich hätten da sein sollen, nicht da sind. Dann sucht man erst recht an der falschen Stelle.
    Dazu kommt, dass die IDE wesentlich besser geeignet ist, Dir bei einer Exception zu helfen, als eine MessageBox. Vergleiche: NullReference-Exeption
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Die im Screenshot fett markierten Spaltennamen dürften wohl Teil von so einer Beziehung sein, aber es ist nicht ganz klar, auf welcher Seite der Fremdschlüssel ist.
    Bei Access kenn ichs so, dass die Primkeys fett markiert sind. Und dann kann man sich die Foreignkeys der anderen Table normalerweise denken, denn in der untergeordneten Tabelle gibts genau die gleichen SpaltenNamen - da gehe ich nu mal davon aus, dass das die Fremdschlüssel sind, passend auf die (ebenso benannten) Primärschlüssel.
    Aber klar - sollte man genau überprüfen.
    Jo, und vlt. liege ich echt falsch, denn nach meim Verständnis sollte das eher eine einzige Relation sein (mit 3 Spalten), aber der Screenshot zeigt 3 einzelne Relationen!

    Also wenn ich überlege - das Datenmodell scheint mir Schrott, oder zumindest höchst zweifelhaft oder zu allermindest höchst erklärungsbedürftig, wie es zu dieser eigentümlichen Konstruktion kommt, und welchen Sinn die haben soll.

    Jdfs. wies aussieht, und was die Fehlermeldung vermeldet ist, dass die einzulesenden Daten ungültig sind, und nicht eingelesen werden können, weil sonst im Datenmodell der Datenbank Widersprüchlichkeiten aufträten.

    Das kann 2 (naja, drei) Gründe haben:
    1. Die Daten sind widersprüchlich und nicht zu gebrauchen
    2. Das Datenmodell der Datenbank ist verfehlt
    3. beides
    Du kannst mal auf jede der 3 Relationen doppelklicken, dann wird ja ein Dialog geöffnet, der anzeigt, wie die Relation konfiguriert ist.
    Davon dann die Screenshots posten, dann sollte man eiglich zu genaueren Aussagen kommen können
    Hier mal dein SQL Statement, ohne das störende String-concatinaten:

    SQL-Abfrage

    1. INSERT INTO Daten_PRO (ZEICHNR, POSNR, QUANTITY, ELMNR)
    2. SELECT Daten_Pro.ZEICHNR, Daten_Pro.POSNR, Daten_Pro.QUANTITY, Daten_Pro.ELMNR
    3. FROM (test Daten_Pro
    4. INNER JOIN Daten_HELP
    5. ON Daten_Pro.ZEICHNR = Daten_HELP.ZEICHNR AND
    6. Daten_Pro.ANDR = Daten_Help.ANDR AND
    7. Daten_Pro.BLATTNR = Daten_HELP.BLATTNR)
    8. VALUES(@ZEICHNR, @POSNR, @QUANTITY, @ELMNR)

    Ist das das SQL Command, welches du ausführen willst?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell