MySQL Probleme mit resultSet executQuery

ZxSpectrum

Mitglied
Hallo zusammen,
vor kurzem habe ich mich einem kleinem Game-Developement Projekt angeschloßen und habe angefangen ein wenig mit Datenbanken zu spielen. Leider stecke ich erst mal an einer Stelle und komme nicht wirklich weiter, vielleicht könnt ihr mir mit einem Rat helfen.

Und zwar, ich versuche mit JDBC ein Table in MySQL zu erzeugen. Habe einiges im Internet rechechiert
Meine Quellen:
https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html
www.tutorialspoint.com/jdbc/jdbc-sample-code.htm
Rheinwerk Computing :: Java ist auch eine Insel – 24.7 Elemente einer Datenbank hinzufügen und aktualisieren

Jedoch in der Zeile 41 bricht das Programm zusammen und kommt folgende Fehlermeldung:
Java:
java.sql.SQLException: Can not issue data manipulation statements with executeQuery().
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
    at com.mysql.jdbc.StatementImpl.checkForDml(StatementImpl.java:472)
    at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1401)
    at conn.ConnectClass.main(ConnectClass.java:41)

Ich habe die Vermutung, dass es ein Syntaxfehler in der CREATE TABLE Anweisung ist, aber vielleicht habe ich etwas übersehen.

Hier füge ich mein gesamtes Quellcode.

[SIZE=+1]
Java:
package conn;
package conn;

import java.sql.*;
import java.util.*;

public class ConnectClass 
{
    //JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/test";

    //Database credentials
    static final String USER = "root";
    static final String PASS = "secret";

    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("Insert your character name: ");

        String tableName = sc.nextLine();
        String autoincrement = "AUTO_INCREMENT";
        Connection conn = null;
        Statement stmt = null;

        try {
            //register JDBC driver
            Class.forName(JDBC_DRIVER);

            //open a connection
            System.out.println("connects...");
            conn=DriverManager.getConnection(DB_URL,USER,PASS);
            System.out.println("Succeeded");
            //Execute a query
            System.out.println("Creating Statement");
            stmt = conn.createStatement();
            String sql;

            sql = "CREATE TABLE "+ tableName + " (ID INTEGER PRIMARY KEY " + autoincrement + ", Str INT(30), " + ", Ag INT(30), " +  "End INT(30));";
            ResultSet rs = stmt.executeQuery(sql);

            //fill table
            System.out.println("Str: ");
            int str = sc.nextInt();
            System.out.println("Agil: ");
            int ag = sc.nextInt();
            System.out.println("Endurance: ");
            int end = sc.nextInt();

            PreparedStatement stmt2 = conn.prepareStatement( "INSERT INTO " + tableName + " (Str, Ag, End) " + " VALUES ( ?, ?, ? );" );
            stmt2.setInt( 1, str );
            stmt2.setInt( 2, ag );
            stmt2.setInt( 2, end );
            stmt2.execute();

            //extract data from result set
            while(rs.next()){
                int id        = rs.getInt("id");
                str            = rs.getInt("Str");
                ag            = rs.getInt("Ag");
                end            = rs.getInt("End");

                //display values
                System.out.println("ID: "            + id);
                System.out.println("Sila: "         + str);
                System.out.println("Zrecznosc: "    + ag);
                System.out.println("Wytrzymalosc: " + end);

            }//while(rs.next())

            //clean environments
            rs.close();
            stmt.close();
            stmt2.close();
            conn.close();
            System.out.println("Connection closed");

        } catch (SQLException sqle) {
            //Handle errors for JDBC
            sqle.printStackTrace();
        } catch (Exception e){
            //Handle errors for Class.forName
            e.printStackTrace();
        } finally {
            //finally block used to close resources
            try {
                if (stmt != null){
                    stmt.close();
                }//if
            } catch (SQLException sqle2) {
            }//catch
            try {
                if (conn != null){
                    conn.close();
                }//if
            } catch (SQLException sqle) {
                sqle.printStackTrace();
            }//catch
        }//finally
    
    }//main
}//public class ConnectClass

Vielen Dank für eure Hilfe im Voraus!

Grüße
ZxSpectrum

[/SIZE]
 
Java:
java.sql.SQLException: Can not issue data manipulation statements with executeQuery().

Ich habe die Vermutung, dass es ein Syntaxfehler in der CREATE TABLE Anweisung ist, aber vielleicht habe ich etwas übersehen.

Ein guter Anhaltspunkt bei der Fehlersuche ist meist, die Fehlermeldung aufmerksam zu lesen, wobei ich zugeben muss, dass diese nicht sooo arg eindeutig ist, aber der Reihe nach:

Laut Fehlermeldung hast du ein Problem beim Ausführen von executeQuery - diese Methode kann offensichtlich für das was du vor hast nicht verwendet werden. An dieser Stelle ist ein Blick in die API-Dokumentation unerlässlich. Dort ist dann recht schnell die folgende Information zu finden:

executeQuery: Executes the given SQL statement, which returns a single ResultSet object.

Das Anlegen einer Tabelle gibt mit Sicherheit kein ResultSet zurück - das gibt es nur bei einem SELECT-Statement.

Also brauchst du, wie Dompteur ja auch schon kurz und knackig beschrieben hat, ein anderes Statement. Da wiederum ist dann die API-Doku erneut hilfreich, denn wo, wenn nicht dort, willst du Infos zum zu verwendenden Statement finden. Direkt im Anschluss an executeQuery gibt es die Erklärung zu

executeUpdate: Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.

Und "such as an SQL DDL statement" ist genau das, was du willst.

(Und auch wenn die Fehlermeldung dir nur sagt, dass du keine "data manipulation statement"s ausführen kannst, was du natürlich auch gar nicht tust, bringt dich die o.g. Fehlersuche weiter.)

Und als letzten Tipp: Eingabe von "cannot issue data manipulation statements with executequery" bei einer Suchmaschine deiner Wahl hilft auch ENORM weiter ;-)
 
Ach, habe gestern vergessen zu antworten. Das mit executeUpdate hat wunderbar funktioniert. Danke Dompteur für den Tipp. Und auch einen Dank an fehlerfinder, dein Beitrag hat mir an einigen Stellen klarheit verschaffen.
 

Zurück
Oben