MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende

  • Themenstarter Themenstarter Deleroy
  • Beginndatum Beginndatum
D

Deleroy

Gast
Nabend,

wie der Titel schon sagt kann ich kein SQL Statement mit Variablen ausführen.

Hier mal wies geht:

Java:
Statement stmnt = dbcon.createStatement();
String insert = "INSERT INTO test(name, vorname) "
+"VALUES('hans', 'martin')";
stmnt.executeUpdate(insert);

Da geht alles glatt ...
Aber wenn ich jetzt z.B.

Java:
Statement stmnt = dbcon.createStatement();
name = "hans";
String insert = "INSERT INTO test(name, vorname) "
+"VALUES("+name+", 'martin')";
stmnt.executeUpdate(insert);

mache dann verabschiedet sich mein client oO was überhaupt keinen sinn macht ... und in der datenbank steht auch nix drin ...

Habt ihr vllt eine Idee??? verzweifel wirklich hier noch
 
Schau dir doch mal den Unterschied zwischen den beiden Befehlen an. Oben hast du um deine Werte Hochkommata, wie es auch gehört. Unten fehlen diese:
Java:
String insert = "INSERT INTO test(name, vorname) "
+"VALUES("+name+", 'martin')";
-->
Java:
String insert = "INSERT INTO test(name, vorname) "
+"VALUES('"+name+"', 'martin')";
Aber am besten nimmst du sowiso PreparedStatements
mfg
Eldorado
 
Ok danke - das hats gebracht ... aber jetzt hab ich weiterhin das problem das die daten z.b richtig angelegt werden.

Aber mein client verliert die verbindung ... aber auch nur wenn ich mit variablen arbeite ...

Was auch lustig ist - ich kann die gesammte Datenbank leeren - ohne fehler und kann danach noch weiterarbeiten, nur wenn ich zb die datenladen will dann kommt - verbindung ok! - und dann terminiert sich mein client.

Hier mal das Datenladen:
Java:
if(Server.db){
						dbmanager();
						Statement stmnt = dbcon.createStatement();
						String lade = "SELECT * FROM promod";
						
						ResultSet rs = stmnt.executeQuery(lade);
						
						while(rs.next()){
							name = rs.getString(name);
							vorname = rs.getString(vorname);
							anrede = rs.getString(anrede);
							strasse = rs.getString(strasse);
							plz = rs.getString(plz);
							ort = rs.getString(ort);
							telefon = rs.getString(telefon);
							fax = rs.getString(fax);
							bemerkung = rs.getString(bemerkung);
							
							ConnectionHandler ladeadresse = new ConnectionHandler(
									name, vorname, anrede, strasse, plz,
									ort, telefon, fax, bemerkung);

							adressliste.add(ladeadresse);
						}
						
						writetoclient.writeUTF("Daten erfolgreich aus DB geladen!");
						writetoclient.flush();
						
					}

Im dbmanager steht eigentlich nur:
Java:
public void dbmanager(){
		try{
		Class.forName("com.mysql.jdbc.Driver").newInstance();
		dbcon = DriverManager.getConnection("jdbc:mysql://dd18734.kasserver.com/d00c8aa6", "d00c8aa6", "123456");

	    if(!dbcon.isClosed()){
	    System.out.println("Successfully connected to " +
	    "MySQL server using TCP/IP...");
	    }

	    } catch(Exception e) {
	      System.err.println("Exception: " + e.getMessage());
	    }
	}
drin.

verstehte auch nicht warum es beim löschen nicht passiert - aber beim laden - speichern und sonst was
 

Ja preparedStatements hab ich beim speichern der daten:

Hier auch mal noch der auszug:
Java:
dbmanager();
						
						String insert = "INSERT INTO promod(name, vorname, anrede,strasse, plz,ort,telefon,fax,bemerkung)"
							+ "VALUES(?,?,?,?,?,?,?,?,?)";
						g=0;
						for (ConnectionHandler aw : adressliste) {
							pstm = dbcon.prepareStatement(insert);
							adressliste.get(g);
							pstm.setString(1, aw.name);
							pstm.setString(2, aw.vorname);
							pstm.setString(3, aw.anrede);
							pstm.setString(4, aw.strasse);
							pstm.setString(5, aw.plz);
							pstm.setString(6, aw.ort);
							pstm.setString(7, aw.telefon);
							pstm.setString(8, aw.fax);
							pstm.setString(9, aw.bemerkung);
							
							if(pstm.executeUpdate()>0){
								
								writetoclient.writeUTF("Daten in DB gesichert!");
								writetoclient.flush();
							}
							
							adressliste.clear();
							g++;
						}
						
						dbcon.close();
					}

auch hier - er connect sich - schreibt die daten rein - und dann passiert irgendwas das mein client sich terminiert
 
Bekomm ja keine Exception ...

bzw ich merke gerade das ich es geschaft habe das mein client weiterläuft - aber die verbindung zum client reist ab.

Ich führe entweder laden oder speichern aus und die socketverbindung bleibt hängen oder so.
Außer beim löschen Oo?!
 
Ich vermute trotzdem mal, daß irgendwo in deinem Code Exceptions gefressen werden. Bau mal in alle Catch-Blöcke ein e.printStackTrace ein, dann poste mal die Ausgaben. Wie stellst Du eigentlich fest, das die Verbindung abreist?
 
sehr guter Tipp ...

also beim speichern kommt

Java:
java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at ConnectionHandler.run(Server.java:986)
Warte auf neue Verbindung ...

und beim laden
Java:
java.lang.NullPointerException
	at java.lang.String$CaseInsensitiveComparator.compare(String.java:1217)
	at java.lang.String$CaseInsensitiveComparator.compare(String.java:1211)
	at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:351)
	at java.util.TreeMap.getEntry(TreeMap.java:322)
	at java.util.TreeMap.get(TreeMap.java:255)
	at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1118)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5617)
	at ConnectionHandler.run(Server.java:1090)
Warte auf neue Verbindung ...

das "Warte auf neue Verbindung" ist am ende der Switch anweisung - welche meine Methoden trennt.
 
Vermutung:

Java:
for (ConnectionHandler aw : adressliste) {

hier wird die Adressliste per Iterator durchiteriert.

Das gibt ein Problem, wenn Du dann clear() auf diese Liste aufrufst. Hinzufügen oder Entfernen soll nur über das Iteratorobjekt passieren, das Du beim ForEach leider aber nicht hast. Also mußt Du eine vernünftige Iteratorschleife bauen. Da Du die Liste "außerhalb" des Iterators veränderst, erhälst Du eine ConcurrentModification-Exception.

Tip:
Ich denke, es kann zu Problemen kommen, wenn du * selektierst und dann nacheinander Name, Vorname usw. per getString("Name)" etc, abfragst und * nicht genau diese Reihenfolge einhält. Manche DB's haben Probleme damit. Bei mySQL weis ich das jetzt nicht genau. Besser Du machst ein "select Name, Vorname, ... from ...". Damit bleibst Du auf jeden Fall DB-Unabhängig.
 

Zurück
Oben