Java Java und MySQL auf dem Holzweg :D

JavaBeginner

Ensign
Registriert
Juli 2015
Beiträge
142
Hallo, wahrscheinlich denken sich die meisten bei dieser Frage "Was für ein Trottel" aber naja, komme einfach nicht auf einen grnen Zweig, darum muss ich leider fragen :)
Nachdem ich mir MySQL angeschaut habe wie mir in einem anderen Thread empfohlen wurde, habe ich versucht mein Ziel zu erreichen, welches darin bestand eine Tabelle zu erstellen (falls diese nicht exisitiert) und Einträge zu bekomen und als Variable abzuspeichern(falls vorhanden) ansonsten soll eine neue Spalte erstellt werden mit den Daten (id, name, datum).
Bisher habe ich mein Ziel nicht einmal annähernd erreicht.
Code:
	    ResultSet rs = conn.getMetaData().getCatalogs();
	    Statement stmt = conn.createStatement();
	    int ID = 12;
	    try{
		stmt.execute("CREATE TABLE eq(ID int,name text);");
	    }catch(Exception ex){
	    	System.out.println("Tabelle existiert bereits.");
	    }
	    stmt.execute("INSERT INTO eq(ID, name)VALUES ('12','Kleeblatt');");
	    boolean last = stmt.execute("select * from Benutzer order by ID asc limit 1");

		String x = "SELECT * from javatest;";
		String search = "SELECT * from Benutzer WHERE ID="+ID+";";
		do{
			String user = "SELECT * from Benutzer WHERE ID="+ID+";";
			ResultSet result = stmt.executeQuery(user);
			System.out.println(result);
		}while(!search.equals(ID));
		System.out.println("Geklappt");
Wäre nett wenn mir jemand helfen könnte^^
 
Zuletzt bearbeitet:
Auf den ersten Blick:

* Du kannst den try...catch-Block um das CREATE TABLE weglassen, wenn du in der Query schreibst: CREATE TABLE IF NOT EXISTS eq... Andererseits geht dir dann die Möglichkeit verloren, "Tabelle existiert bereits" auszugeben, für Debugging-Zwecke würde ich es daher erst mal so lassen. Nur ein Tip :)
* Der Datentyp "text" ist für längere Texte gedacht. Wenn deine Namen nur "normal" lang sind, wäre VARCHAR die geeignetere Wahl.
* Zeile 9: Du gibst drei Spalten zum Einfügen an (ID, name, Datum), aber nur zwei Werte. Außerdem hat die Tabelle, so wie du sie weiter oben anlegst, auch nur zwei Spalten (ID, name).
* Zeile 18: Das ist eine Endlosschleife. Schau noch einmal genau, was du da vergleichst und ob sich diese Werte in der Schleife ändern können (Spoiler: nein, können sie nicht ;))

Wenn du noch konkretere Probleme hast, dann müsstest du dazuschreiben, was genau nicht klappt.
 
wenn du werte aus dem ResultSet lesen willst, musst du das ResultSet öffnen, dann die zeilen auslesen, dann das ResultSet schließen. (schließen entfällt mit try with ressource)

in etwa so (keine garantie, dass es so compiliert):

Code:
try(ResultSet result = stmt.executeQuery(user);){
    // hat ergebnis noch eine zeile?
    while(result.next()){
        for(int i = 1; i <= result.getMetaData().getColumnCount(); ++i){
            System.out.print(result.getString(i) + " ");
        }
        System.out.println();
    }
}
 
Zuletzt bearbeitet:
So, habe da jetzt mal noch ein bisschen herumprobiert.
Code:
 ResultSet rs = conn.getMetaData().getCatalogs();
	    Statement stmt = conn.createStatement();
	    int ID = 12;
	    try{
		stmt.execute("CREATE TABLE klo(ID int,name text);");
	    }catch(Exception ex){
	    	System.out.println("Tabelle existiert.");
	    }
	    stmt.execute("INSERT INTO klo(ID,name)VALUES ('12','Kleeblatt');");
	    stmt.execute("ALTER TABLE klo ADD User (ID int,name VARCHAR(25);");
	    ResultSet last = stmt.executeQuery("select * from Benutzer order by ID asc limit 1");

		String user = "SELECT * from klo WHERE ID=12;";
		ResultSet result = stmt.executeQuery(user);

		int columns = rs.getMetaData().getColumnCount();

		StringBuilder message = new StringBuilder();

		while (result.next()) {
		    for (int i = 1; i <= columns; i++) {
		        message.append(result.getString(i) + "");
		    }

		}
		System.out.println(message);
		if(message.equals(Integer.toString(ID))){
		System.out.println(message);
		System.out.println("Geklappt");
		}else{	
		System.out.println("Fehler");
	}
	}
Das ist was dabei herauskam. Es wird mir jedoch immer "Fehler" ausgegeben, obwohl 12 enthalten ist. Ebenfalls habe ich einen SQL-Syntax-Fehler bei
stmt.execute("ALTER TABLE klo ADD User (ID int,name VARCHAR(25);");
Jemand eine Idee wo der Fehler liegt?
 
vergleiche doch mal das, was gemacht werden soll, mit dem, was du geschrieben hast.

warum willst du die tabelle klo verändern?
willst du eine neue tabelle User erstellen?

und in zeile 11 greifst du auf nicht existierende tabelle Benutzer zu
 
So, nun bi ich fast am Ziel.
Code:
	    Statement stmt = conn.createStatement();
	    String name = "Klemens";
	    try{
		stmt.execute("CREATE TABLE Reload(UUID text,name text,game_id int,world_id int,game_name text);");
	    }catch(Exception ex){
	    	System.out.println("Tabelle existiert.");
	    }
	    stmt.execute("INSERT INTO Reload(UUID,name,game_id,world_id,game_name)VALUES('4s8aSDd6AS8D','Klemes','25','569','Klemens');");

		String user = "SELECT * from Reload WHERE game_name='"+name+"';";
		ResultSet result = stmt.executeQuery(user);

		while(result.next())
		{
		    String ch = result.getString("game_name");
		    if(ch.equals(name)){
		    	System.out.println("Erfolg");
		    }
		}

	}
Ist dabei herausgekommen. Nun habe ich noch ein paar Fragen, Wenn ich hier nun Erfolg ausgegeben wird und der Name enthalten ist, wie kann ich die game_id des Users bekommen? Wenn ich z.b.
Code:
System.out.println(result.getInt("game_id"));
mache, werden mir alle ID's ausgegeben. Wie bekomme ich jedoch nur die eine ID des Users?
Ebenfalls eine Frage ist, wie kann ich nachdem ich die ID des Users bekam eine neue für die ID des Users eintragen?
 
JavaBeginner schrieb:
Wenn ich z.b. (...) mache, werden mir alle ID's ausgegeben. Wie bekomme ich jedoch nur die eine ID des Users?
Vermutung: Deine Tabelle enthält mehrere Einträge mit game_name="Klemens".
JavaBeginner schrieb:
Ebenfalls eine Frage ist, wie kann ich nachdem ich die ID des Users bekam eine neue für die ID des Users eintragen?
Normalerweise sollte man die User-ID nicht ändern, da diese meist auch in anderen Tabellen benutzt wird. Es sei denn, die "ID des Users" bezieht sich bei dir gar nicht auf die User-ID. Dann wäre das Stichwort ALTER.

Mach dich mal über ER-Diagramme schlau und auch über Normalisierungen. Dann bekommst du solche Probleme nicht mehr.
 
NullPointer schrieb:
Auf den ersten Blick:

* Du kannst den try...catch-Block um das CREATE TABLE weglassen, wenn du in der Query schreibst: CREATE TABLE IF NOT EXISTS eq... Andererseits geht dir dann die Möglichkeit verloren, "Tabelle existiert bereits" auszugeben, für Debugging-Zwecke würde ich es daher erst mal so lassen. Nur ein Tip :)
Eigentlich nicht, denn wenn z.B. der Server nicht mehr erreichbar ist, wird auch eine Exception geworfen - der Fall sollte in professionellem Code behandelt werden, zum Lernen ist es aber eigentlich egal. Sobald der Code aber in einem Programm bzw. auf einer Webseite verwendet wird, muss sowas geprüft und der Fehler behandelt werden (z.B. durch einen neuen Verbindungsversuch oder Abbruch mit einer Fehlermeldung).

Ein paar Hinweise noch, die am Anfang nicht so wichtig sind, die du aber im Hinterkopf behalten solltest:

Du kannst dir mal prepared statements ansehen, um sicher gegen MySQL Injections zu sein und die Anfragen schneller abzuarbeiten, da das SQL nicht jedes Mal in ausführbaren Code übersetzt werden muss.

Bedenke beim Einsatz von MySQL in einem Programm, das du an andere Personen schickst oder veröffentlichst, bitte auch die Lizenz - das müsste die GPL sein, wenn ich mich nicht irre.
 
Hey, hat jemand eine Idee wie ich das mit der if-Abfrage machen kann? Momentan funktioniert es nämlich nicht.
Code:
if(message.equalsIgnoreCase("AKzeptieren")){
		            			try{
		            				String testing = "select world_database_id, game_name from Kleopatra where game_name ='"+sf.Name()+"';";
		    	            		ResultSet result1 = stmt.executeQuery(testing);
		    	            		while(result1.next()){
		    	            			if(result1.getString("game_name").equals(sf.getName())){
		    	            			System.out.println("Vorhanden");
		    	            		}else{
		    	            			stmt.execute("INSERT INTO Kleopatra (UUID,world_name,world_database_id,game_name) VALUES ('"+database.getuuid()+"','"+database.Name()+"','"+database.tDatabaseId()+"','"+sf.Name()+"');");
		    	            		}}
		            			}catch(Exception ex){
		            				System.err.println(ex);
		            			}
		            		}
Zu beginn ist der User nicht vorhanden, falls er die Bedingungen schon einmal akzeptiert hat soll die Table geupdatet werden (ist noch nicht vorhanden, da es momentan an if/else in der while schleife scheitert). Jemand eine Idee wie ich das Problem
 
Die Verschachtelung ist falsch. Das Insert wird nie ausgeführt, da das Ergebnis der if-Bedingung immer wahr ist.
 
Darlis schrieb:
Die Verschachtelung ist falsch. Das Insert wird nie ausgeführt, da das Ergebnis der if-Bedingung immer wahr ist.

Darf man fragen wo genau der Fehler liegt? Normalerweise sollte else doch asugeführt werden da if ja überprüft ob der Name gleich eine Variable ist. Sollte der Eintrag aber nicht existieren bedeutet es doch das else ausgeführt wird oder?
Also, die Tabelle ist momentan leer und sollte somit keinen Namen enthalten.

Edit:
Habe es so probiert,
Code:
		    	            		ResultSet result1 = stmt.executeQuery(testing);
		    	            		while(result1.next()){
		    	            		if(!(result1.getString("game_name").equals(sf.getName()))){
		    	            			System.out.println("Vorhanden");
		    	            		}else if(result1.getString("game_name").equals(sf.getName())){
		    	            			stmt.execute("INSERT INTO Kleopatra (UUID,world_name,world_database_id,game_name) VALUES ('"+database.getuuid()+"','"+database.Name()+"','"+database.DatabaseId()+"','"+sf.Name()+"');");
		    	            			System.out.println("Neu erstellt.");
		    	            		}}
So bekomme ich immerhin als Ausgabe "Neu erstellt" jedoch auch die Fehlermeldung "java.sql.SQLException: Operation not allowed after ResultSet closed" wo liegt denn hierbei der Fehler?
 
Zuletzt bearbeitet:
Das Problem ist, dass wenn in der Tabelle kein Eintrag mit game_name = sf.Name() vorhanden ist, result1.next() auch nie true liefern wird. Bei dir muss es aber irgendwie wahr werden, damit das INSERT ausgeführt werden kann. Das war dir offenbar nicht bewusst, sonst hättest du innerhalb der while-Schleife nicht nochmal game_name = sf.Name() abgefragt (als ob du dem Ergebnis der Datenbankabfrage nicht trauen würdest).

In deinem Edit hast du die Abfrage jetzt nochmal unnötig verkompliziert und die Bedingung auch noch vertauscht ("Wenn 'Name' NICHT vorhanden, dann Ausgabe 'Vorhanden'").
Die Fehlermeldung kommt vermutlich nachdem du nochmal versucht eine Zeile aus dem ResultSet zu lesen?
 
Darlis schrieb:
Das Problem ist, dass wenn in der Tabelle kein Eintrag mit game_name = sf.Name() vorhanden ist, result1.next() auch nie true liefern wird. Bei dir muss es aber irgendwie wahr werden, damit das INSERT ausgeführt werden kann. Das war dir offenbar nicht bewusst, sonst hättest du innerhalb der while-Schleife nicht nochmal game_name = sf.Name() abgefragt (als ob du dem Ergebnis der Datenbankabfrage nicht trauen würdest).

In deinem Edit hast du die Abfrage jetzt nochmal unnötig verkompliziert und die Bedingung auch noch vertauscht ("Wenn 'Name' NICHT vorhanden, dann Ausgabe 'Vorhanden'").
Die Fehlermeldung kommt vermutlich nachdem du nochmal versucht eine Zeile aus dem ResultSet zu lesen?

Ales klar, das mit der while-Schleife war mir bisher nicht klar^^
Das bedeutet ich muss in die catch anweisung das INSERT packen, liege ich damit richtig?

Edit:
Probiert und es klappt anscheinend nicht.
Code:
try{
		            				String testing = "select world_database_id, game_name from Kleopatra where game_name ='"+sf.Name()+"';";
		    	            		ResultSet result1 = stmt.executeQuery(testing);
		    	            		while(result1.next()){
		    	            		System.out.println(result1.getString("world_database_id"));
		    	            		}
		            			}catch(Exception ex){
		            				System.err.println(ex);
	    	            			try {
										stmt.execute("INSERT INTO Kleopatra (UUID,world_name,world_database_id,game_name) VALUES ('"+database.getuuid()+"','"+database.Name()+"','"+database.DatabaseId()+"','"+sf.Name()+"');");
									} catch (SQLException e) {
										System.out.println(e);
									}

		            			}
Sollte das zweite mal die id ausgeben was jedoch nicht gemacht wird. Fehlermeldung bit es auch nicht.
 
Zuletzt bearbeitet:
Dann wird das insert auch nicht ausgeführt, es sei denn jemand nennt sich "bobby'; DROP TABLE Users;--".
Du musst es ausführen, wenn es eben keinen Eintrag gibt.
 
Darlis schrieb:
Dann wird das insert auch nicht ausgeführt, es sei denn jemand nennt sich "bobby'; DROP TABLE Users;--".
Du musst es ausführen, wenn es eben keinen Eintrag gibt.

Hehe, das ist leicher als gesagt^^
Das wollte ich ja mit einer if-Abfrage erledigen. Das klappt jedoch nicht, nun stellt sich mir die Frage: Wie kann ich überprüfen ob von diesem einen User ein Eintrag existiert?
Was mir noch einfallen würde, wäre eine while-Schleife in einer while-Schleife. Sicher bin ich mir jedoch nicht.
 
vielleicht so? (pseudo)

rs = executeSelect()
if(!rs.next()){
insert()
}

wenn das nicht das macht was du willst, beschreibe doch mal ohne code, was du überhaupt erreichen willst. vielleicht hilft es auch, dir mal die API zu ResultSet durchzulesen, insbesondere, was next() überhaupt macht ;)
 
Code:
try{
	            				String testing = "select world_database_id, game_name from Kleopatra where game_name ='"+sf.Name()+"';";
	    	            		ResultSet result1 = stmt.executeQuery(testing);
	    	            		if(!result1.next()){
	    	            			System.out.println("Muss erstellt werden.");
	    	            			stmt.execute("INSERT INTO Kleopatra (UUID,world_name,world_database_id,game_name) VALUES ('"+database.getuuid()+"','"+database.Name()+"','"+database.DatabaseId()+"','"+sf.Name()+"');");
	    	            		}else{
    	            		    	stmt1.execute("UPDATE Kleopatra SET world_database_id="+database.DatabaseId()+",UUID='"+database.getuuid()+"' WHERE game_name='"+player.Name()+"';");
			    	            		System.out.println(result1.getString("world_database_id"));
			    	            		
			    	            	}

			            			}catch(Exception ex){
		    	            			System.err.println(ex);
	    	            		}

Ist was bisher herauskam, funktioniert auch (fast) alles. Nur ist mir das mit der Fehlermeldung "java.sql.SQLException: Operation not allowed after ResultSet closed" noch ein Rätsel. Eigentlich schließe ich ja nichts und es findet alles noch im gleichen try teil statt.
 
JavaBeginner schrieb:
Fehlermeldung "java.sql.SQLException: Operation not allowed after ResultSet closed"
Der erste Google-Treffer verrät dir warum das so ist und wie du es lösen kannst.

JavaBeginner schrieb:
Eigentlich schließe ich ja nichts
Das solltest du aber machen.
 
JavaBeginner schrieb:
Ist was bisher herauskam, funktioniert auch (fast) alles. Nur ist mir das mit der Fehlermeldung "java.sql.SQLException: Operation not allowed after ResultSet closed" noch ein Rätsel. Eigentlich schließe ich ja nichts und es findet alles noch im gleichen try teil statt.

Wenn man keinen Debugger nutzen will oder kann, sollte man sich zumindest den Stacktrace der Exception ausgeben lassen. Damit weiß man dann zumindest, wo genau der Fehler auftritt, was bei der Fehlersuche sehr hilfreich sein kann.
 
Ich habe immer noch nicht verstanden, was genau du erreichen willst. Und wieso heißt die Tabelle Kleopatra? Mach doch zunächst ein Entity-Relationship-Modell und poste es hier, dann können wir dir vermutlich besser helfen. Deine Tabellen- und Spalten-Namen ergeben auf den ersten Blick jedenfalls keinen Sinn.
 
Zurück
Oben