MySQL INSERT schlägt nicht fehl, fügt aber auch nichts ein

Sich

Mitglied
Guten Morgen an alle,

ich sitze hier gerade an einem Problem, dass ich einfach nicht vertsehe und deswegen auch nicht beseitigen kann.
Ich versuche Mittels eines PreparedStatement und INSERT in eine Tabelle mit Nutzern, einen neuen Nutzer einzutragen (PS: ich weiß das passwörter gehashed werden ;-) ). Es wird jedoch de facto nichts in die Tabelle eingetragen, obwohl keine Ausnahme oder sonst eine Fehlermeldung auftritt.

Ich habe Debugausgaben eingefügt, die (so wie ich das verstehe eigentlich nahe legen, dass die Zeile eingetragen wurde?!):
ANZAHL-INSERTS: liefert 1
Zuletzt eingetragene ID: liefert letzte ID++ (also obwohl nichts eingetragen wird, wird da hochgezählt)
nickname: beinhaltet auch den letzten "eingetragenen" Namen

Hier der Java-Code mit Debug-Outs
Java:
try {
			
			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
			
			try {
				
				UserInformation user = new UserInformation(name, password);

				String url = "jdbc:mysql://" + dbHostname + ":" + dbPort + "/" + dbDBName;

				Connection conn = DriverManager.getConnection(url, dbLogInName, dbLogInPassword);
				conn.setAutoCommit(false);
				
				String sqlCommand = "INSERT INTO users (id, nickname, password) VALUES (null, ?, ?)";
				PreparedStatement ps = conn.prepareStatement(sqlCommand, Statement.RETURN_GENERATED_KEYS);

				// Parameter werden übergeben
				ps.setString(1, user.getName());
				ps.setString(2, user.getPassword());
				System.out.println("ANZAHL INSERTS: " + ps.executeUpdate());
				ResultSet rs = ps.getGeneratedKeys();
				rs.next();
				System.out.println("Zuletzt eingetragene ID: " + rs.getInt(1));
	            
				String sqlCommand2 = "SELECT * FROM users";
				PreparedStatement ps2 = conn.prepareStatement(sqlCommand2);

				ResultSet rs2 = ps2.executeQuery(); // Statement wird ausgeführt.

				rs2.last();
				System.out.println(rs2.getNString("nickname"));
				ps2.close();
				
				ps.close();
			} catch (SQLException sqle) {
				System.err.println("SQLException: " + sqle.getMessage());
				System.err.println("SQLState: " + sqle.getSQLState());
				System.err.println("VendorError: " + sqle.getErrorCode());
			}
		} catch (Exception e) {
			System.err.println("..Unable to load MySQL-Driver.");
			e.printStackTrace();
		}

Hoffe jemand kann mir Helfen, schonmal vielen Dank im Voraus!

Gruß
Sich
 
Java:
String sqlCommand = "INSERT INTO users (id, nickname, password) VALUES (null, ?, ?)
Ist "id" der Primary Key? Keine Ahnung, ob es daran liegen könnte, aber versuch doch mal anstall "null" für den Primary Key "DEFAULT" einzugeben.
 
Java:
String sqlCommand = "INSERT INTO users (id, nickname, password) VALUES (null, ?, ?)
Ist "id" der Primary Key? Keine Ahnung, ob es daran liegen könnte, aber versuch doch mal anstall "null" für den Primary Key "DEFAULT" einzugeben.

Ja, "id" ist der Primärschlüssel, habe es auch mit "DEFAULT" probiert, mit dem selben Ergebnis: der getGeneratedKeys() liefert wieder die letzte id + 1, etc. aber in der Tabelle ändert sich nichts..
 
Java:
String sqlCommand = "INSERT INTO users (id, nickname, password) VALUES (null, ?, ?)
Ist "id" der Primary Key? Keine Ahnung, ob es daran liegen könnte, aber versuch doch mal anstall "null" für den Primary Key "DEFAULT" einzugeben.

nein - einfach weg lassen ... den füllt die DB selber aus

Java:
String sqlCommand = "INSERT INTO users (nickname, password) VALUES (?, ?)

hand, mogel
 
Vor allem wo der TO
Java:
...
Connection conn = DriverManager.getConnection(url, dbLogInName, dbLogInPassword);
conn.setAutoCommit(false);
...
aufruft.

Weiterhin ist
Java:
...
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
...
veraltet. Du solltest da den neuen Driver ("com.mysql.jdbc.Driver") nehmen.
 
nein - einfach weg lassen ... den füllt die DB selber aus

Java:
String sqlCommand = "INSERT INTO users (nickname, password) VALUES (?, ?)

hand, mogel

Das hatte ich zu Anfang auch aber dann umgeschrieben, da dachte, dass da vielleicht der Fehler lag. Es geht aber halt auch nicht in dieser Variante.

Die Tabelle auslesen und erreichen geht aus der Java-App ohne Probleme.
Der DB-User hat die Rechte: INSERT, SELECT, UPDATE, EXECUTE das sollte ja eigentlich auch reichen, zumindest kann der außerhalb des Javaprogramms Daten einfügen.

Danke für eure bisherigen Tipps!
 
Meinen Post hattest du gelesen?

Entweder du entfernst setAutoCommit(false) oder du commitest nach dem Insert über conn.commit(); manuell!
 
Meinen Post hattest du gelesen?

Entweder du entfernst setAutoCommit(false) oder du commitest nach dem Insert über conn.commit(); manuell!

Nein, hatte ich in der Tat noch nicht 🙂
Aber daran hats gelegen, wenn ich jetzt selber das "commit" ausführe, wird auch in die Tabelle eingetragen.
Zudem habe ich auch den Treiber erneurt, wusste nicht, dass der andere nicht mehr aktuell war.
Also vielen Dank für den Hinweis und Deine Hilfe!

mogel hat gesagt.:
musiKk hat gesagt.:
Aber doch nur, wenn die Spalte mit AUTO_INCREMENT angelegt wurde, oder? Ich kann jedenfalls nicht finden, dass das per Default aktiv ist.
ja klar - ich ging jetzt davon aus das der OP das auch entsprechend in der Tabelle hinterlegt hat (aufgrund des Spaltennamens)

Ja, das id-Feld ist AUTO_INCREMENT.

Vielen Dank, auch für eure Hilfe!

Gruß
Sich
 

Zurück
Oben