MySQL Einfügen von Datensätzen über Java

Diskutiere Einfügen von Datensätzen über Java im Datenbankprogrammierung Forum; Hallöchen, ich melde mich nun wieder bezüglich eines kleineren Problems zu Wort. Die letzte Problematik bezüglich des Verbindungsaufbaus habe...

  1. FawKes100
    FawKes100 Mitglied
    Hallöchen,
    ich melde mich nun wieder bezüglich eines kleineren Problems zu Wort.
    Die letzte Problematik bezüglich des Verbindungsaufbaus habe ich bereits bewältigt.
    Nun stellt sich jedoch bei den Abfragen ein kleines Problem. Ich kann Problemlos eine normale Abfrage über Select tätigen. So frage ich zunächst einmal ab ob ein Command mit einem bestimmten Titel existiert. Ich habe hierzu in der Datenbank eine Tabelle angelegt, die die Spalten commandTitle, count und id besitzt. Nun frage ich die Datenbank mit folgendem SQL-Syntax ab:
    Code (Text):
    SELECT * FROM commands WHERE commandTitle='" + title + "'
    title ist hierbei ein x-Beliebiger String, der den Namen des Commands beinhaltet.
    Dies funktioniert soweit auch noch fehlerfrei.
    Nun überprüfe ich ob das ResultSet welches ich von der Abfrage zurück erhalte überhaupt gefüllt ist. Das mache ich mit
    Code (Text):
    resultset.first();
    . Dieses liefert mir bei den Commands ein false also möchte ich die nicht vorhandenen Commands einfügen. Das mache ich mit diesem Befehl:
    Code (Text):
    INSERT INTO `commands`(`commandTitle`, `count`) VALUES ('" + title + "','0')"
    title ist wie zuvor die Variable des CommandTitels. Die 0 entspricht dem Wert für Count. Das was ich weggelassen habe ist die Id im SQL Befehl, da die ja von der Datenbank automatisch mitgeführt werden sollte. Im Webinterface unter phpmyadmin hat dieser befehl auch funktioniert und einen Eintrag angelegt.
    Hier vl einmal der Code von der SQLAbfrage im allgemeinen:

    Code (Java):
     public ResultSet executeQuarry(String querry)
        {
            try {
                if (connection != null)
                {
                    statement = connection.createStatement();
                    return statement.executeQuery(querry);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return null;
        }
    Nun erhalte ich allerdings bei jedem Command der hinzugefügt werden soll folgende Fehlermeldung im Stacktrace:

    Code (Text):
    java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
            at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
            at com.mysql.cj.jdbc.StatementImpl.checkForDml(StatementImpl.java:384)
            at com.mysql.cj.jdbc.StatementImpl.executeQuery(StatementImpl.java:1153)
            at mysql.DatabaseConnector.executeQuarry(DatabaseConnector.java:40)
            at core.Twitch.registCommands(Twitch.java:95)
            at core.Twitch.<init>(Twitch.java:48)
            at core.Main.main(Main.java:25)
     
    Kann ich möglicherweise für Eingaben nicht die selbe Methode nutzen wie für ausgaben?
     
  2. Vielleicht hilft dir diese Seite hier weiter (Klick!)
  3. mihe7
    mihe7 Bekanntes Mitglied
    Richtig. Die Methode wäre executeUpdate. Verwende aber bitte PreparedStatement, statt die Parameter selbst in den SQL-String zu bekommen.

    Nachtrag:
    Code (Java):

    private static final String INSERT_CMD =
        "INSERT INTO `commands`(`commandTitle`, `count`) VALUES (?, '0')";

    public void addCommand(String command) throws SQLException {
        try(PreparedStatement stmt = connection.prepareStatement(INSERT_CMD)) {
            stmt.setString(1, command);
            stmt.executeUpdate();
        }
    }
     
     
    Zuletzt bearbeitet: 28. Sep. 2018
  4. FawKes100
    FawKes100 Mitglied
    Nun habe ich dieses Problem gelöst :)
    Probleme macht nun aber das Abfragen..
    Ich versuche mit dem SQL-Befehl
    Code (Text):
    SELECT `count` FROM `commands` WHERE `commandTitle`='" + title + "'
    die Anzahl wie häufigder Command mit dem Titel der in title gespeichert ist, abzufragen.

    Wenn ich den Befehl mit dem Titel manuell über phpmyadmin eingebe, erhalte ich eine korrekte Antwort..
    Der Befehl wird zwei mal ausgeführt. Einmal wenn ich den Inhalt der Spalte "Count" des Commands um einen erhöhen möchte und dann wenn ich das Ergebnis als Ausgabestring schreiben möchte. Das erste Mal scheint es auch Problemlos zu funktionieren. Beim zweiten mal erhalte ich aber 0 als Auskunft...

    *Edit Das Problem hab ich jetzt gelöst, indem ich die Variable Count als Klassenvariable mitführe und so nicht in der Methode neu abfragen musste..


    Code (Java):
     ResultSet quoteSize = databaseConnector.executeQuarry("SELECT Count(`quoteID`) FROM `quotes` ");
                try {
                    if(quoteSize.first())
                    {
                        int count = (quoteSize.getInt(1));
                        variabels.setQuotes(String.valueOf(count));
                    }
    Mich würde aber trotzdem mal interessieren warum das nicht ein zweites Mal klappt...
    Ist möglicgherweise der index falsch?
     
    Zuletzt bearbeitet: 3. Okt. 2018
  5. mihe7
    mihe7 Bekanntes Mitglied
    Das Modell in der DB gibt auch keinen Sinn: man speichert nicht die Anzahl der Datensätze im Datensatz und zählt dann manuell hoch, sondern man lässt die DB zählen. Die Spalte count kannst Du Dir also sparen:
    Code (SQL):
    SELECT COUNT(*) FROM commands WHERE commandTitle=:title
     
  6. FawKes100
    FawKes100 Mitglied
    nein... Die Variable count zählt nicht, wie viele Datensätze mit dem Commandtitle title existieren. Die Spalte count zählt auch sobald der ursprüngliche Command aufgerufen wurde. Bedeutet soviel: Ich gebe den Command ein und er soll den Wert der Spalte um eins erhöhen und nicht nen neuen Datensatz anlegen. Wenn ich anschließend abfragen will wie häufig der Command ausgeführt worden ist muss ich den Inhalt dieser Spalte abfragen, da dort hinterlegt ist, wie häufig der Command schon aufgerufen worden ist.

    Nen kleinerer Test mit int count als Klassenvariable hat aber noch verrückteres ans Tageslicht gebracht: Auch diese wird mit "0" gespeichert... Obwohl sie in der System-Ausgabe vorher nicht 0 war...

    Der Fehler hierdrann lag wohl daran, dass ich erst die Antwort des Bots ausgeben hab lassen und dann den Wert Count um erins verändert habe. Erklärt aber immer noch nicht warum der bei der ersten Variante mit der doppelten Abfrage nicht das richtige ausgegeben hat.

    Hoffe mal, dass die anderen abfragen für die verschiedenen Variablen der Botantwort funktionieren... Merkwürdig ist des allemal..
     
  7. mihe7
    mihe7 Bekanntes Mitglied
    Ah, das erklärt einiges :)

    Naja, int-Instanz-/Klassenvariablen werden mit 0 initialisiert.

    Poste mal den Code.
     
  8. FawKes100
    FawKes100 Mitglied
    Das Problem um die 0 hat sich mittlerweile tatsächlich erledigt. Hatte in dem Antwort String ne falsche "Variable" drinn, wo es richtig war dass sie durch 0 ersetzt wird.
    Doch ich habe immer noch beim Abfragen der Datenbank meine Schwierigkeiten. Ich versuche das Resultset welches ich bei der Abfrage erhalte in ein zweidimensionales String Array umzuwandeln. Dieses tue ich mit folgendem Code:

    Code (Java):
     resultSet.last();
            int count = resultSet.getRow();
            resultSet.first();

            this.querryResult = new String[count][resultSet.getMetaData().getColumnCount()];
            int row = 0;
            while(resultSet.next())
            {
                for(int i=0; i < resultSet.getMetaData().getColumnCount(); i++)
                {
                    String result = resultSet.getString(i+1);
                    System.out.println("[Querry-Result] " + result);
                    querryResult[row][i] = result;
                }
                row++;
            }
    Das Problem ist allerdings, dass in der Konsole nichtmal was mit "[Querry-Result]" ausgegeben wird, was so viel bedeutet, wie dass die for-Schleife nicht aufgerufen wird, soweit ich das einschätzen kann. Frage ich möglicherweise die Anzahl der Reihen falsch ab? Generell frage ich mich wie ich aus diesem "eindimensionalen" Resultset nen zwei dimensionales Array machen soll - wie das überhaupt funktionieren kann oder setzt resultSet.next() den "Pointer" eine Reihe tiefer?
    Den Code zum Konvertieren von dem Resultset zu nem Array hab ich im Netz gefunden:
    https://stackoverflow.com/questions/24547406/resultset-into-2d-array

    Ich vermute halt generell dass entweder die Anzahl der Reihen falsch ermittelt wird oder aber die Konvertierung selbst falsch ist. Lasse ich nämlich das StringArray anschließend über System.out.println() ausgeben, so wird zwei mal "null" in die Konsole geschrieben.
    Würde es ggf etwas bringen die Datenstruktur vom zweidimensionalen Array in eine ArrayList<String[]> abzuändern? Hiermit wäre das abfragen der Anzahl der Reihen nicht mehr notwendig..
     
  9. stg
    stg Bekanntes Mitglied
    Du rufst resultSet.first und resultSet.next auf. Wie viele Results stecken denn in deinem ResultSet?
     
  10. mihe7
    mihe7 Bekanntes Mitglied
    Der Ansatz ist nicht ganz falsch. Du müsstest aber rs.beforeFirst() statt rs.first() verwenden, weil rs.next() den Cursor auf den nächsten Satz setzt. Was Du auch nicht willst, ist für jede Zeile die Metadaten abzurufen. Einmal reicht.

    rs.last() ist auch nicht unbedingt effizient. Oft ist es besser, sich per SQL die Zahl der Zeilen zu holen (SELECT count(*) ...)

    Unabhängig davon frage ich mich eher, warum Du unbedingt ein Array haben willst. Mit einer Collection würdest Du Dich leichter tun.
     
  11. Hinweis: Du möchtest Java lernen? Vielleicht hilft dir dieser Kurs hier weiter. Sichere dir hier den Zugriff auf umfangreiches Java-Know How und starte richtig durch!
Die Seite wird geladen...

Einfügen von Datensätzen über Java - Ähnliche Themen

Elemente in Liste einfügen
Elemente in Liste einfügen im Forum Java Basics - Anfänger-Themen
(WindowBuilder) Panels in einen Frame einfügen
(WindowBuilder) Panels in einen Frame einfügen im Forum Java Basics - Anfänger-Themen
Probleme bei der Formatierung beim Einfügen und löschen über DOM
Probleme bei der Formatierung beim Einfügen und löschen über DOM im Forum XML und Co.
Java Bilder einfügen
Java Bilder einfügen im Forum Java Basics - Anfänger-Themen
TreeTableView (cellFactory) - wie Daten in Spalten einfügen
TreeTableView (cellFactory) - wie Daten in Spalten einfügen im Forum AWT, Swing, JavaFX & SWT
Thema: Einfügen von Datensätzen über Java