MySQL Einfügen von Datensätzen über Java

FawKes100

Aktives 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:
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:
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:
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:

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:
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?
 

mihe7

Top Contributor
Richtig. Die Methode wäre executeUpdate. Verwende aber bitte PreparedStatement, statt die Parameter selbst in den SQL-String zu bekommen.

Nachtrag:
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:

FawKes100

Aktives Mitglied
Nun habe ich dieses Problem gelöst :)
Probleme macht nun aber das Abfragen..
Ich versuche mit dem SQL-Befehl
Code:
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..


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:

mihe7

Top Contributor
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:
SQL:
SELECT count(*) FROM commands WHERE commandTitle=:title
 

FawKes100

Aktives 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..
 

mihe7

Top Contributor
wie häufig der Command schon aufgerufen worden ist.
Ah, das erklärt einiges :)

mit int count als Klassenvariable hat aber noch verrückteres ans Tageslicht gebracht: Auch diese wird mit "0" gespeichert...
Naja, int-Instanz-/Klassenvariablen werden mit 0 initialisiert.

Erklärt aber immer noch nicht warum der bei der ersten Variante mit der doppelten Abfrage nicht das richtige ausgegeben hat.
Poste mal den Code.
 

FawKes100

Aktives 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:

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..
 

stg

Top Contributor
Du rufst resultSet.first und resultSet.next auf. Wie viele Results stecken denn in deinem ResultSet?
 

mihe7

Top Contributor
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?

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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Auto Increment und nachträgliches einfügen Datenbankprogrammierung 5
N SQL-Statement Java Variable in SQL DB einfügen Datenbankprogrammierung 1
C String in Datenbank einfügen Datenbankprogrammierung 11
V Datenbankwerte in Array einfügen Datenbankprogrammierung 1
P JSP - Daten aus 2 Tabellen in eine neue Tabelle einfügen Datenbankprogrammierung 1
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
L H2 100000 Entries in Datenbank einfügen Datenbankprogrammierung 10
E Wie kann man BLOB-Spalten in DB2 einfügen? Datenbankprogrammierung 9
P Java Timestamp in Datenbank einfügen Datenbankprogrammierung 5
Helgon H2 byte[] in BINARY einfügen Datenbankprogrammierung 4
S MySQL Einfügen in Tabelle nur von Programm zulassen Datenbankprogrammierung 7
M MySQL User Eingaben in die DB einfügen Datenbankprogrammierung 7
H Oracle In Datenbank Einfügen Datenbankprogrammierung 20
L Hibernat will Daten nicht einfügen??? Datenbankprogrammierung 2
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
J In viele verschiedene Datenbanken einfügen Datenbankprogrammierung 3
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
D MySQL Problem beim einfügen von Double-Zahlen Datenbankprogrammierung 4
Eldorado MySQL Hibernate - neuen Datensatz einfügen Datenbankprogrammierung 2
C Variable in MySQL einfügen Datenbankprogrammierung 2
S Daten einer Tabelle vergleichen und ggs neuen Wert einfügen Datenbankprogrammierung 8
M Keine doppelten Datensätze einfügen Datenbankprogrammierung 24
M SQL Abfrage in jTable einfügen Datenbankprogrammierung 8
S Bilder in Oracledatenbank einfügen Datenbankprogrammierung 5
G Problem beim einfügen in der Datenbank Datenbankprogrammierung 4
K Daten in Datenbanken einfügen Datenbankprogrammierung 6
E [SQL, Oracle] Zeile einfügen Datenbankprogrammierung 8
M JDBC: Viele Datensätze in Tabelle einfügen: Wie? Datenbankprogrammierung 7
T Tabelle in datenbank einfügen Datenbankprogrammierung 2
D Tabelle eine Zeile einfügen. Datenbankprogrammierung 3
A Blob in Oracle-DB einfügen (veraltete Methode) Datenbankprogrammierung 3
thE_29 Tool zum Einfügen in Oracle DB Datenbankprogrammierung 16
C Datensatz einfügen und quittierung Datenbankprogrammierung 31
N Datenbank in diese Klasse einfügen Datenbankprogrammierung 4
D Generelle Frage zum Umgang mit Datensätzen Datenbankprogrammierung 5
H MySQL Ablage von vielen Datensätzen Datenbankprogrammierung 14
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
O SQL: Zusammenfassen von Datensätzen Datenbankprogrammierung 2
R Probleme mit Datensätzen in MySql DB Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
tom.j85 Objekt in OneToOne Beziehung über http request anzeigen lassen Datenbankprogrammierung 3
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
M MySQL Passwort Clientseitig ändern und über Button ausführen Datenbankprogrammierung 0
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
K HSQLDB .sql Script Aufruf über Java Datenbankprogrammierung 7
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
L H2 Embedded H2 Datenbank über Netzwerk zugreifen? Datenbankprogrammierung 0
W SQL-Statement Datenbankabfrage über Yahoo Datenbankprogrammierung 0
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
I JPA - BoneCP über die persistence.xml konfigurieren Datenbankprogrammierung 0
AssELAss Oracle Wildcard-Suche über zwei Felder Datenbankprogrammierung 5
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
K SQL Befehle über java Oberfläche Datenbankprogrammierung 4
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
G JDBC Connect nur über SID fehlerfrei möglich Datenbankprogrammierung 2
M Information über Änderungen Datenbankprogrammierung 8
F MySQL Daten ändern über Java Datenbankprogrammierung 3
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
B DB Anbindung über Tomcat Datenbankprogrammierung 16
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
S mySQL Manipulation über JavaServer Faces (Tutorial gesucht) Datenbankprogrammierung 10
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
C H2 über DynDNS Datenbankprogrammierung 2
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
C Datenbanklogin über JSF Datenbankprogrammierung 3
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
J mit java in access DB über odbc/jdbc Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
1 Aufruf einer View über Java Gui Datenbankprogrammierung 5
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
M Messenger über MySQL sinnvoll? Datenbankprogrammierung 7
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
multiholle SQL Querry über mehrere Spalten Datenbankprogrammierung 12
klattiator Aufklärung über OR-Mapping Datenbankprogrammierung 7
B Mysql über jdbc sehr langsam Datenbankprogrammierung 4
X Abfrage über 2 Tabellen mit Tücken Datenbankprogrammierung 3
M Auswerten über drei Tabellen Datenbankprogrammierung 2
O Mittelwert über mehrere Zeilen Datenbankprogrammierung 11
P Benötige etwas Hilfe bei Datanbankabfrage über Java Datenbankprogrammierung 3
R Abfrage über Zwischentabellen? Datenbankprogrammierung 2
N Unbekannte Datenbank über Metadaten auslesen? Datenbankprogrammierung 9
S Select über mehrere Datenbanksysteme Datenbankprogrammierung 14
S Mysql abfrage über 2 tabellen. Datenbankprogrammierung 10
U Java und Mysql Problem über 24:00:00 Stunden Datenbankprogrammierung 4
M MySQL-Datenbank über Java ansprechen Datenbankprogrammierung 5
W Zwei Fragen über JDBC und MySQL Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben