SQL Statement benötigt

Also in deinem Statement passt ganz ganz viel nicht....


tmt.executeUpdate("INSERT INTO testlearner (userId, documentId, message, documentAffiliation) "
+ "VALUES (10","12","'SuccessfullFeedbackEvent'","'true'")"ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=5,'true','')");


DAS kann so niemals funktionieren. Bitte einmal die Stringverkettung in Java anschauen.


tmt.executeUpdate("INSERT INTO testlearner (userId, documentId, message, documentAffiliation) VALUES (10,12,'SuccessfullFeedbackEvent','true') ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=5,'true',''))");


So sollte es (basierend auf deinen Daten) einen erfolgreichen Insert oder eben ein Update über Java geben, sofern Datenbank und Tabelle wie du sie beschrieben hast existent sind. Ansonsten hau bitte mal ne try catch um die Anweisung und gib hier die Exception aus. Danke dir

Grüße

P.s.: aus dem funktionierenden Statement von oben hast du wieder mehrere Änderungen durchgeführt (u.a. eine Klammer weggelassen im IF Block und das >=4 zu =5 gemacht) - warum?
 
Werbung:
Also damit bekomme ich diese Meldung:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
 
Ok, wie gedacht ist das jetzt ein Java Problem (prepareStatement) und das müsstest du einmal googeln. Java ist auch nicht mehr meine aktuelle Sprache und da kann ich dir nur sporadisch helfen aber es sieht so aus, dass Java an der Stelle erwartet, dass du Placeholder benutzt für deine Variablen im Statement und diese durch entsprechende Methoden dann später durch Echtwerte ersetzt. Warum er hier ein update nicht zulässt, wenn ich keine Variablen benutze müsste ich selbst erst in Erfahrung bringen.

Aber wahrscheinlich müsstest du erstmal einen String definieren für den SQL Befehl un die Platzhalter einfügen

String stmnt = "INSERT INTO testlearner (userId, documentId, message, documentAffiliation) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=5,'true',''))";

Dann das Statement vorbereiten

PreparedStatement pre_st = tmt.prepareStatement(stmnt);

Die Platzhalter ersetzen

pre_st.setString(1, "10");
pre_st.setString(2, "12");
pre_st.setString(3, "'SuccessfullFeedbackEvent'");
pre_st.setString(4, "'true'");

Und dann das ganze executen

pre_st.executeUpdate();

Ohne Gewähr!

Aber zumindest das SQL Statement sollte so aber auf jeden Fall funktionieren.
 
Also habe mal bisschen getestet. Lokal läuft alles. In der Cloud hat die SQL Probleme mit dem DUBLICAT KEY... Wenn ich das weglasse bekomme ich einen korrekten Eintrag.

("INSERT INTO testlearner (userId, documentId, message, documentAffiliation) VALUES ('" + uId
+ "','" + dId + "','" + ms + "','" + dA
+ "')");

So funktioniert alles
 
Wenn ich direkt per Shell die SQL ausführe ohne JAVA-Form funktioniert es...Schätzungsweise ist da ein oder zwei Kommas falsch... :)
 
Wenn du das Statement MIT der ON DUPLICATE KEY Logik lokal ausführst, funktioniert es und genau das Gleiche Statement funktioniert dann auf dem Server nicht? Dann liegt es wahrscheinlich an unterschiedlichen MySQL Versionen.

Wie gesagt: das Statement funktioniert bei mir und auch bei dir nachdem du es getestet hast, da ist also nichts mehr dran falsch. Jetzt musst du schaun, wodran es noch liegen kann. Wenn es in Java nicht geht, wird es am Java Code liegen. Geht es nur als SQL Anweisung auf dem Server nicht, wird es wie gesagt wahrscheinlich an der Version liegen.


Grüße
 
Ok habs....

so passt es
Code:
("INSERT INTO testlearner (userId, documentId, message, documentAffiliation) VALUES ('" + uId
                    + "','" + dId + "','" + ms + "','" + dA
                    + "') ON DUPLICATE KEY UPDATE rate= (rate+1), favor = (IF((rate+1)=5,'true',''))");
 
Werbung:
Zurück
Oben