Einfügen von Datenbankeinträgen via Java

Calmalor

Cadet 4th Year
Registriert
Apr. 2012
Beiträge
66
Hallo,

ich bin derzeit dabei Versuchsweise eine Datenbank via Java zu befüllen. Die benötigten Daten werden dabei mit einem Zufallsgenerator generiert und dann mit einem SQL-Statement in der Datenbank eingetragen.

Im ersten Anlauf mit dem ersten SQL-Statement hat dieser Vorgang auch reibungslos funktioniert. Nur das zweite SQL-Statement bleibt jetzt beim ersten Eintrag hängen. Also nicht mal der erste Eintrag wird abgeschlossen. Änderungen zum vorherigen SQL-Statement gab es keine bis auf die Tatsache, dass es sich jetzt um eine andere Tabelle handelt.


Das SQL-Statement an sich ist fehlerfrei und lässt sich so rauskopieren und manuel über den SQL-Developer einfügen.

Anbei noch weitere Fotos vom Code.
Hier einem der DatabaseHelper zum Herstellen der Verbindung.
Code:
DatabaseHelper() {
        try {
            //Loads the class into the memory
            //Class.forName(CLASSNAME);

            // establish connection to database
            con = DriverManager.getConnection(DB_CONNECTION_URL, USER, PASS);
            stmt = con.createStatement();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Hier die beiden Insert Statements. Das erste von beiden funktioniert.
Code:
    //INSERT INTO Kunde
    void insertIntoKunde(int plzint, String ort, String strasse, String hausnummer, String vorname, String nachname, int alterkint) {
        try {
            String sql = "INSERT INTO KUNDE (PLZ, ORT, STRASSE, HAUSNUMMER, VORNAME, NACHNAME, ALTERK) VALUES ('" + plzint + "','" + ort + "', '" + strasse + "', '" + hausnummer + "', '" + vorname + "', '" + nachname + "', '" + alterkint + "')";

            stmt.execute(sql);
        } catch (Exception e) {
            System.err.println("Error at: insertIntoKunde\nmessage: " + e.getMessage());
        }
    }

    //INSERT INTO Auftrag
    void insertIntoAuftrag(int kundennummerint, String steuernummer) {
        try {
            String sql = "INSERT INTO AUFTRAG (KUNDENNUMMER, STEUERNUMMER) VALUES ('" + kundennummerint + "', '" + steuernummer + "')";
            System.out.println(sql);
            stmt.execute(sql);
            con.commit();

        } catch (Exception e) {
            System.err.println("Error at: insertIntoAuftrag\n:" + e.getMessage());
        }
    }

Nachfolgend sind jetzt die beiden Übernahmen der Daten aus dem Zufallsgenerator. Das erste Foto gehört zum ersten SQL-Statement und das zweite zum zweiten.
Code:
    //INSERT INTO Kunde Random
    void insertKundeRandom(int NumKunden) {
        String plz;
        String ort;
        String strasse;
        String hausnummer;
        String vorname;
        String nachname;
        String alterk;

        RandomHelper rdhelper = new RandomHelper();
        for (int i = 0; i < NumKunden; ++i) {
            plz = rdhelper.getRandomplz();
            ort = rdhelper.getRandomort();
            strasse = rdhelper.getRandomstrasse();
            hausnummer = rdhelper.getRandomhausnummer();
            vorname = rdhelper.getRandomvorname();
            nachname = rdhelper.getRandomnachname();
            alterk = rdhelper.getRandomalterk();
            System.out.println(plz);
            System.out.println(alterk);

            int plzint = Integer.parseInt(plz);
            int alterkint = Integer.parseInt(alterk);

            insertIntoKunde(plzint, ort, strasse, hausnummer, vorname, nachname, alterkint);

        }
    }

Code:
    //INSERT INTO AUFTRAG Random
    void insertAuftragRandom(int NumAuftraege) {
        String kundennummer;
        String steuernummer;

        RandomHelper rdhelper = new RandomHelper();
        for (int i = 0; i < NumAuftraege; ++i) {
            kundennummer = rdhelper.getRandomkundennummer();
            steuernummer = rdhelper.getRandomsteuernummer();
            System.out.println(kundennummer);
            System.out.println(steuernummer);

            int kundennummerint = Integer.parseInt(kundennummer);

            insertIntoAuftrag(kundennummerint, steuernummer);

        }
    }



Für Hinweise wäre ich sehr dankbar.

Beste Grüße
 
Zuletzt bearbeitet:
Welche Datenbank nutzt du? Normalerweise muss man eine Transaktion öffnen und auch commiten. Vergiss aber nicht, das Statement an einer Stelle auch wieder zu schließen ;-)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Calmalor
Und poste doch einfach bitte den anonymisierten Code, statt Screenshots.
So können dir Forumuser direkt(er) helfen.
 
  • Gefällt mir
Reaktionen: Calmalor und phm666
Hallo,

den Code habe ich mal als ZIP-Datei angehängt. Die Datenbank ist von Oracle. Das Statement wird weiter unten wieder geschlossen. Das war auf den Screenshots nicht zu sehen. :)
Danke für eure Antworten!
 
Auch hier wieder der Hinweis, deinen Code einfach in "[ CODE] .... [ /CODE]" zu packen

1612177166377.png
 
  • Gefällt mir
Reaktionen: Calmalor
Danke für den Hinweis. Habe es ergänzt. Wie gesagt das erste Insert Statement läuft auch erfolgreich durch. Nur das zweite (Auch wenn ich beides seperat durchführe) hat irgendein Problem.

Noch als Anmerkung. Wenn ich das SQL-Statement abändere, um entsprechende Fehlermeldungen auszugeben, dann werden die auch so zurückgegeben.
 
Zuletzt bearbeitet:
@Calmalor Da wird dann die Transaktion fehlen. Bitte versuche dich da mal ins Transaktionhandling der Oracle einzuarbeiten. Ein Tipp für später: Niemals Daten direkt in ein Statement einarbeiten. Das kann für SQL-Injektion benutzt werden. Bei sowas immer ein PreparedStatement verwenden.
 
Dank für deine Antwort @phm666. Das werde ich auf jeden Fall mal tun, weil das bereitet mir bis jetzt immer am meisten Probleme.
Inzwischen scheine ich die Ursache gefunden zu haben, wobei der Grund dafür mir noch nicht klar ist.
Und zwar war mir schon beim der PHP Seite aufgefallen, dass wenn ich mit Werten arbeite, die ich manuell per Oracle SQL-Developer einfüge, diese Werte nicht wieter benutzen konnte.

Das heißt wenn ich zum Beispiel ein Update Statement durchführe für einen Wert in einer Tabelle, die ich per SQL-Developer hinzugefügt habe, konnte ich dieses Update nie durchführen. Das ging nur mit Werten die ich ebenso über die PHP Seite hinzugefügt habe. Andersherum habe ich allerdings mit dem SQL-Developer vollen Zugriff auf sämtliche Werte egal woher sie kommen.

Jetzt dachte ich mir dieses Verhalten könnte auch auf das Java Script zutreffen und auf einmal funktioniert es.

In den einzufügenden Werten für Auftrag ist nämlich ein Fremschlüssel enthalten von der Entität "Online_Shop". Da ich die Werte für diese Entität samt allen anderen Tabellen per SQL-Developer eingefügt habe, war er scheinbar nicht in der Lage die Aufträge per Java Script hinzuzufügen.

Hat irgendjemand eine Idee woran das liegen könnte? Den Fehler habe ich scheinbar gefunden, nur verstehe ich nicht warum ich nicht mit Werten arbeiten kann, die ich per Oracle SQL-Developer hinzugefügt habe.
 
Calmalor schrieb:
Wie gesagt das erste Insert Statement läuft auch erfolgreich durch. Nur das zweite (Auch wenn ich beides seperat durchführe) hat irgendein Problem.
Calmalor schrieb:
In den einzufügenden Werten für Auftrag ist nämlich ein Fremschlüssel enthalten von der Entität "Online_Shop".
Das 2. ist das "INSERT INTO AUFTRAG"? Also die Tabelle, die einen Fremdschlüssel auf die Tabelle(?) "Online_Shop" hat? Der ist in dem insert aber gar nicht angegeben. Es sollte eine entsprechende Fehlermeldung auftreten.
 
  • Gefällt mir
Reaktionen: Calmalor
Mir ist gerade noch aufgefallen, dass du beim "insertIntoAuftrag" einen Commit machst. Wenn eine Transaktion abgeschlossen ist, musst du das Statement schließen und dann für weitere Operationen ein neues Statement öffnen. Am Besten erzeugst du das Statement nicht als Membervariable, sondern reichst es jedes Mal in die Methoden als Parameter durch.
 
  • Gefällt mir
Reaktionen: Calmalor
Calmalor schrieb:
zweite SQL-Statement
Das Problem liegt wohl darin, dass du nur ein Statementobjekt, mit con.createStatement(), erstellst. Sobald du auf einem Statementobjekt ein execute aufrufst, dann ist sein Leben so ziemlich beendet. Für dein zweites Statement mußt du ein neues Statementobjekt erstellen.
 
  • Gefällt mir
Reaktionen: Calmalor
Also inzwischen habe ich es zum Laufen gebracht. Danke für eure Hinweise!

Das Problem war, dass ich die Tabelle "Online_Shop" in der der Primärschlüssel "Steuernummer" enthalten ist per SQL-Statement im Oracle SQL Developer eingefügt hatte. In der Tabelle "Auftrag" wurde darauf mit einem Fremschlüssel referenziert. Eigentlich war die Tabelle auch vorhanden, nur kann ich scheinbar aus irgendeinem Grund auf die Tabellen, die ich per SQL Developer einfüge nicht, nicht per Java oder PHP Seite zugreifen und deswegen hat er ohne Fehlermeldung einfach nichts gemacht.

Nachdem ich noch eine Java Funktion für "Online_Shop" erstellt habe, hat es funktioniert. Obwohl die Tabelle vorher auch schon vorhanden war.
 
Zurück
Oben