MySQL INSERT will einfach nicht funktionieren

markus99

Bekanntes Mitglied
Hallo!

Ich versuche mich gerade in SQL Abfragen.
Soviel dazu: Abfragen selbst sind kein Thema, ich hole problemlos Daten aus selbst erstellten Tabellen und zeige diese in JTables an.

Nun wollte ich versuchen einen neuen Datensatz in eine Tabelle einzufügen!

Die Tabelle sieht wiefolgt aus:
Index(int), Vorname(text), Nachname(text), Straße(text), PLZ(int), Ort(text), Telefon(int)

Der Versuch (etwa der 100ste):
Ich bekomme alle Daten als Eingabe von einer weiteren Klasse zurück geliefert und rufe
die cmdSQL mit allen Parametern auf! Einige Werte brauch ich als int, also werden diese unten konvertiert.

Java:
public static void cmdSQL(String Index, String Vorname, String Nachname, String Straße, String PLZ, String Ort, String Telefon)
	{
		try 
		{
			PreparedStatement statement = cn.prepareStatement("INSERT INTO benutzer (Index, Vorname, Nachname, Straße, PLZ, Ort, Telefon) VALUES ( ?, ?, ?, ?, ?, ?, ?)");
			statement.setInt(1, Integer.parseInt(Index)); //Auch bei direkter Eingabe kein Erfolg
			statement.setString(2, Vorname);
			statement.setString(3, Nachname);
			statement.setString(4, Straße);
			statement.setInt(5, Integer.parseInt(PLZ));
			statement.setString(6, Ort);
			statement.setInt(7, Integer.parseInt(Telefon));
			statement.execute();
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
	}

Ich habe es bereits überall mit " ' " ect. versucht, leider kein Erfolg.
Syntax Errors, jedes mal.
Java:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Index, Vorname, Nachname, Straße, PLZ, Ort, Telefon) VALUES ( 3, 'a', 'b', 'c',' at line 1
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)
	at TestWnd.cmdSQL(TestWnd.java:184)
	at InputDlg$1.actionPerformed(InputDlg.java:101)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Bitte um Ratschläge.

Gruß,
Markus
 
Du verwendet Schlüsselwörter als Spaltennamen (Index). Ob Straße geht (ß) weis ich jetzt nicht. Du mußt die Spaltennamen maskieren, sonst wird das nix.

siehe Backticks
 
wenn du den index in der db als primärschlüssel und auf autoincrement gesetzt hast, musst du diesen beim insert nicht mit übergeben.
beim insert selbst: Strings in `<data>` , integer ohne

hier ein Beispiel:
Java:
 public void insert(Toureintrag eintrag,String table1) {
        System.out.print("Tabelle: "+table1);
        int id = eintrag.getId();
        double kilometer = eintrag.getKilometer();
        double durchkmh = eintrag.getDurchkmh();
        double maxkmh = eintrag.getMaxkmh();
        String wohin = eintrag.getWohin();
        String zeit = eintrag.getZeit();
        String zusatz = eintrag.getZusatz();
        String datum = eintrag.getDatum() + "";

        String insert2 = "'" + datum + "'," + kilometer + ",'" + zeit + "',"+durchkmh+"," + maxkmh + ",'" + wohin + "'," + "'" + zusatz + "'";
        System.out.println(insert2);


        try {
            Statement statement = connection.createStatement();
            statement.executeUpdate("Insert into "+table1+" (`Datum`, `Kilometer`,`Zeit`,`DurchKmh`,`MaxKmh`, `Wohin`, `Zusatz`) values (" + insert2 + ")");
        } catch (Exception ex) {
            System.out.println("Insert fehlgeschlagen" + ex);
        }

    }
 
Nimm lieber eine andere Bezeichnung als "Index", das verwirrt sonst nur. Umlaute und sonstige Sonderzeichen würde ich auch vermeiden.
 
- passen die Spaltennamen?
- passen die Spaltentypen?
- keine Keywords der Datenbankverwendet?
- MySQL hat vermutlich mit dem Namen "Index" ein Problem...nimm nen anderen Namen für die Spalte!

- Variablen schreibt man in camelCaseSchreibweiseUndNichtMitGrossbuchstabenAmAnfang!
 
Vielen Dank!

Es lag an der Index, ich darf natürlich keine Zahlen weitergeben, da AI hier aktiv ist.
Die PreparedStatement müssen nicht extra maskiert werden 🙂

Grüße,
Markus
 
Edit (kann leider den Beitrag nicht mehr editieren):
Möchte man die Index abfragen, so muss man dies mit 'Index' machen.

Hier z.B. als PreparedStatement:

Java:
			int i = 1 //zu löschende Index-Nummer(Zeilennummer)
			PreparedStatement statement = cn.prepareStatement("DELETE FROM `datenbank`.`tabelle` WHERE `tabelle`.`Index` = ?");
			statement.setInt(1, i); //Nach Wert "i" in Spalte 1 suchen
			statement.executeUpdate(); //Kommando ausführen

Vielleicht hilfts jemandem.
 
Es ist schon ganz interessant ...
Einfach nur zum Testen habe ich ne Methode geschrieben, die:
1. Den Tabelleninhalt löscht
2. Die Inkrementierungen zurücksetzt
3. Den lokal (vorher von Datenbank) abgerufenen Inhalten eine neue Index Nummer verpasst
4. Alles upzuloaden - ohne exception.

Funktioniert wunderbar, hat mich wohl nur am Anfang gefuchst.
 

Zurück
Oben